Написал программу и хотел бы добавить в неё многопоточность, проблема в том что юзер сам должен выбрать количество потоков. Ну и ещё пару нюансов) У меня, предположим, есть массив A, который имеет некое количество элементов. И есть функция B, которая выполняет некоторые действия над одним элементом. То есть предположительно у меня есть такой псевдокод: Code: A[] = {1.2.3.4.5...} for(int c = 0; c <= sizeof(A); c++){ B(A[c]); } И мне нужно распараллелить это, и при этом юзер сам должен выбирать количество потоков. Дайте кому не сложно примерный алгоритм всех действий, которые нужны.
Если B всегда производит действия только с одним элементом массива A, то достаточно наладить синхронизацию переменной "c", ведь каждый поток будет ее инкрементировать (неважно, сколько потоков будет). В C++ нет средств для синхронизации (в stl), поэтому для сохранения кроссплатформенности можно использовать библиотеку boost. Там и потоки есть, и объекты синхронизации.
Ну использовать boost ради только многопоточности я не могу, иначе тогда раз так, то и всё нужно будет под boost переписывать) Я думал использовать _beginthread, если это подойдёт есть два вопроса: 1. Как лучше синхронизировать? 2. Как создать неопределенное количество потоков уже при работа в программе? Я думал обернуть всё в класс, а потом использовать как динамический массив, но столкнулся с трудностями...
Совсем необязательно. boost - это хорошее дополнение к stl, а не мегафреймворк, который все функции того же stl замещает. В stl (если смотреть на C++ ранее 0x) нет объектов синхронизации. _beginthread - это майкрософтовая функция (некроссплатформенное решение), тогда на выбор большой набор функций. Конкретно для безопасного инкремента подходит эта. Руками, с помощью цикла и собственно _beginthread или _beginthreadex.