2012-02-15 2 views
0

Я пишу программу, использующую потоки в C++ в linux.многопоточный предел?

В настоящее время я просто храню массив потоков, и каждый раз, когда проходит одна секунда, я проверяю, какие из них закончены, и перезапустите их. Это плохо? Мне нужно, чтобы эта программа работала в течение длительного времени. Как и сейчас, я получаю код 11 после стольких циклов перезапуска потоков (100-й цикл в последнем испытании). Я решил, что повторное использование потоков и убедитесь, что у меня есть только небольшое количество из них, работающих в любой момент времени, что я бы не попал в лимит. Массив, который я использую, имеет размер 8 (разумеется, я не запускаю 8 каждый раз, только те, которые остановились).

Любые идеи?

Мой код ниже:

if (loop_times == 0 || pthread_kill(threads[t],0) != 0) 
{ 
    rc = pthread_create(&threads[t], NULL, thread_stall, (void *)NULL); 
    if (rc){ 
     printf("ERROR; return code from pthread_create() is %d\n", rc); 
     exit(-1); 
    } 
thread_count++; 
} 

Переменная loop_times просто так, что я могу попасть в петлю и начать резьбе в первый раз. В противном случае я получаю SEGFAULT, потому что нити не были запущены раньше.

Кроме того, я хотел, чтобы увидеть значение PTHREAD_THREADS_MAX, но я не могу распечатать его (даже при включении limits.h)

+0

Если ваша программа работает некоторое время, вы можете использовать ps -eLf, чтобы проверить, сколько потоков использует linux. – masebase

+0

Если вы используете недавний компилятор, используйте C++ вместо pthreads. –

+0

Это очень плохая практика, чтобы убивать темы. Пусть они закончат. Многие API потоковой передачи не дадут вам такой возможности, те, кто говорят, что это не очень хорошая идея. –

ответ

1

Как оказалось, моя проблема заключалась в том, что мне нужно было pthread_join мой поток, прежде чем перезапускать его каждый раз. После этого я перестала получать код 11 и перестала иметь «все еще доступную» память при запуске через Valgrind.

2

Если вы хотите использовать несколько потоков ... Это лучше пойти для пула потоков. Начните набор потоков как отдельных, а затем через очередь вы можете отправлять информацию в каждый поток, чтобы он мог работать над этим и ждать следующего ввода от вас.

+0

Для этого есть библиотека без форсирования (boost.threadpool). –

+0

Кроме того, создание множества потоков, вероятно, приведет к уменьшению производительности вашего приложения. –

+0

Вот почему я использую максимум восемь за раз в любой момент времени. Возможно, я не понимаю ваш комментарий. – Risshuu

Смежные вопросы