[c++] Многопоточное приложение

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by KwanzaBot, 29 May 2011.

  1. KwanzaBot

    KwanzaBot New Member

    Joined:
    24 Apr 2011
    Messages:
    1
    Likes Received:
    0
    Reputations:
    0
    Написал программу и хотел бы добавить в неё многопоточность, проблема в том что юзер сам должен выбрать количество потоков. Ну и ещё пару нюансов)
    У меня, предположим, есть массив A, который имеет некое количество элементов. И есть функция B, которая выполняет некоторые действия над одним элементом.
    То есть предположительно у меня есть такой псевдокод:
    Code:
    A[] = {1.2.3.4.5...} 
    for(int c = 0; c <= sizeof(A); c++){
    B(A[c]);
    } 
    И мне нужно распараллелить это, и при этом юзер сам должен выбирать количество потоков. Дайте кому не сложно примерный алгоритм всех действий, которые нужны.
     
  2. GRRRL Power

    GRRRL Power Elder - Старейшина

    Joined:
    13 Jul 2010
    Messages:
    823
    Likes Received:
    185
    Reputations:
    84
    Если B всегда производит действия только с одним элементом массива A, то достаточно наладить синхронизацию переменной "c", ведь каждый поток будет ее инкрементировать (неважно, сколько потоков будет). В C++ нет средств для синхронизации (в stl), поэтому для сохранения кроссплатформенности можно использовать библиотеку boost. Там и потоки есть, и объекты синхронизации.
     
  3. KwanzaBot

    KwanzaBot New Member

    Joined:
    24 Apr 2011
    Messages:
    1
    Likes Received:
    0
    Reputations:
    0
    Ну использовать boost ради только многопоточности я не могу, иначе тогда раз так, то и всё нужно будет под boost переписывать)
    Я думал использовать _beginthread, если это подойдёт есть два вопроса:
    1. Как лучше синхронизировать?
    2. Как создать неопределенное количество потоков уже при работа в программе? Я думал обернуть всё в класс, а потом использовать как динамический массив, но столкнулся с трудностями...
     
  4. GRRRL Power

    GRRRL Power Elder - Старейшина

    Joined:
    13 Jul 2010
    Messages:
    823
    Likes Received:
    185
    Reputations:
    84
    Совсем необязательно. boost - это хорошее дополнение к stl, а не мегафреймворк, который все функции того же stl замещает.

    В stl (если смотреть на C++ ранее 0x) нет объектов синхронизации. _beginthread - это майкрософтовая функция (некроссплатформенное решение), тогда на выбор большой набор функций. Конкретно для безопасного инкремента подходит эта.

    Руками, с помощью цикла и собственно _beginthread или _beginthreadex.