Я пишу многопоточное решето Эратосфена, где мне приходится использовать pthreads. Я почти уверен, что это можно сделать с помощью мьютексов и cond_waits. Я создаю 4 потока в начале программы, а затем заставляю их ждать, пока Решето Эратосфена не найдет простое число. Затем я должен разблокировать потоки, чтобы они могли помечать каждую итерацию этого простого числа в битовом массиве. Затем они должны снова заблокировать и ждать следующего простого числа, пока алгоритм решета Эратосфена не исчерпает себя новыми числами.
Это код из моей многопоточной функции:
while(!doneFlag){
printf("Thread wile loop\n");
pthread_mutex_lock(&lock);
pthread_cond_wait(&cond, &lock);
startingPosition = (double)(maxNum/numThreads) * i;
endingPosition = (double)(maxNum/numThreads) * (i+1)-1;
if(i == numThreads-1){
endingPosition = maxNum;
}
... Until the end of the function ...
pthread_mutex_unlock(&lock);
}
return (void*)0;
doneFlag — это флаг, который я устанавливаю в 1, когда алгоритм решета Эратосфена завершает работу со всеми числами. Я надеялся, что цикл while с функцией cond_wait() заставит потоки ждать ввода (до тех пор, пока остается ввод данных)
Вот часть сита в функции main():
while(outerCounter < sqrt(maxNum)){
//searching numbers above the current for prime numbers
//printf("Sieve While\n");
for(innerCounter = outerCounter+1; innerCounter <= maxNum; innerCounter++){
//not composite
//printf("Sieve for\n");
if(composite[innerCounter] == 0){
printf("Prime found: %d\n", innerCounter);
pthread_mutex_lock(&lock);
pthread_cond_broadcast(&cond);
pthread_mutex_unlock(&lock);
outerCounter = innerCounter;
numPrimes++;
}
}
}
doneFlag = 1;
Каким-то образом составные числа не помечаются как составные (хотя пара помечена). Я предполагаю, что это как-то связано с состоянием гонки с функцией main(), как она продолжает находить больше простых чисел, пока потоки все еще работают в фоновом режиме, тем самым изменяя простое число, пока потоки все еще работают.
Как я могу это исправить? Правильно ли настроены мои блокировки/cond_wait? Мне очень трудно найти ресурсы для этого в Интернете.
Спасибо!
Изменить: я также хочу убедиться, что каждый из моих потоков может запускать функцию одновременно (функция - это то, что помечает элементы в массиве как составные). Может быть, мьютексы не являются хорошей идеей в моей функции потока, поскольку я хочу, чтобы они работали вместе? (Каждый поток занимает другой сегмент массива)