Я уже несколько дней работаю над небольшой программой на C, которая использует pthreads. Я провел более или менее весь вчера в поисках тупиковой ошибки, но теперь я обнаружил, что проблема на самом деле не в тупиковой ошибке. Следующий фрагмент кода имеет точно такую же проблему.
#include <stdlib.h>
#include <pthread.h>
#include <semaphore.h>
#include <stdio.h>
#include <unistd.h>
#define NTHREADS 507
pthread_mutex_t runningThreadsMutex;
pthread_cond_t runningThreadsCond;
int runningThreads = 0;
void* HelloWorld(void* arg) {
sleep(1);
pthread_mutex_lock(&runningThreadsMutex);
runningThreads--;
printf("End thread %d\n", runningThreads);
pthread_cond_signal(&runningThreadsCond);
pthread_mutex_unlock(&runningThreadsMutex);
return NULL;
}
int main() {
pthread_t thread;
pthread_mutex_init(&runningThreadsMutex, NULL);
pthread_cond_init(&runningThreadsCond, NULL);
for (int i = 0; i < NTHREADS; ++i) {
pthread_mutex_lock(&runningThreadsMutex);
printf("Create thread %d\n", runningThreads++);
pthread_mutex_unlock(&runningThreadsMutex);
pthread_create(&thread, NULL, HelloWorld, NULL);
// pthread_detach(thread);
}
pthread_mutex_lock(&runningThreadsMutex);
while(runningThreads > 0) {
pthread_cond_wait(&runningThreadsCond, &runningThreadsMutex);
}
pthread_mutex_unlock(&runningThreadsMutex);
return 0;
}
Кажется, что приведенный выше код прекрасно работает на моем ноутбуке (64-битной машине Linux) для NTHREADS <506. В этом случае он печатает что-то вроде этого: </p>
Create thread 0
Create thread 1
.
.
.
Create thread 505
End thread 505
End thread 504
.
.
.
End thread 0
И заканчивается как следует. Однако, если я использую NTHREADS> = 506, например, NTHREADS = 510 я получаю
Create thread 0
Create thread 1
.
.
.
Create thread 509
End thread 509
End thread 508
.
.
.
End thread 4
, где он останавливается, никогда не заканчивая. Таким образом, кажется, что последние четыре (510-506 = 4) потока никогда не завершаются (или вообще не запускаются?).
Я пробовал этот код также на старой 32-битной машине Linux. Там я получаю такое же поведение, за исключением того, что оно хорошо работает для NTHREADS <382, но не для NTHREADS> = 382 (вместо 506).
Когда я гуглил решение, я также нашел этот вопрос: http://bytes.com/topic/c/answers/728087-pthreads-limit,, где у кого-то возникает такая же проблема при использовании pthread_join (что может быть более естественно при работе с pthreads), но они не приносят никакой пользы объяснение.
Может кто-нибудь объяснить мне, что я делаю неправильно и в чем заключается основная проблема с этим кодом? Я предполагаю, что это должно быть какое-то ограничение на количество разрешенных потоков, но как мне с этим бороться?