C ++ UNIX: Threading: заставляет основной поток ждать или спать, пока обработка не закончится - основной поток не знает ссылок pthread_t - PullRequest
0 голосов
/ 20 сентября 2011

sc-> start_server запускает бесконечный цикл, в котором в потоке вызывается метод обработки MyClass. Как заменить оператор while (true) в main, чтобы моя программа ожидала завершения всех потоков?

РЕДАКТИРОВАТЬ: используется pthreads-lib и main () не знает ссылки pthread_t

THX

 int main(int argc, char** argv)
    {

            SocketCommunication * sc = SocketCommunication::get_menu();  //Singleton

            MyClass yay;       
            short port = 6644;

            sc->start_server(port, &yay);

            while(true);

        return 0;
    }

Ответы [ 2 ]

3 голосов
/ 20 сентября 2011

Обычный способ (по крайней мере в pthreads):

  1. У вас есть несколько pthread_t ссылок на запущенные потоки.
  2. Вместо цикла while вконец, вы ждете, пока все они завершатся с чем-то похожим на pthread_join(threadX, NULL);, для всех потоков.

В вашем случае я не вижу API для получения потоков, но один разВы получаете доступ к выполняющимся потокам (возможно, запрашивая sc в некотором роде), код будет аналогичным.

EDIT :

Если вы просто хотите подождатьдля условия легко с условными переменными.Предположим, у вас есть эти:

pthread_mutex_t end_mutex = PTHREAD_MUTEX_INITIALIZER;
pthread_cond_t  condition_var = PTHREAD_COND_INITIALIZER;
bool all_threads_done = false; // Signals that all the threads are finalized

Затем в вашем main() вы можете ожидать его с помощью:

pthread_mutex_lock( &end_mutex );
while (!all_threads_done) 
    pthread_cond_wait( &condition_var, &end_mutex );

wait освободит мьютекс во время ожидания.Затем в каждом потоке вы должны иметь следующее:

// Do whatever the thread has to do...
// ...
// and then, at the end...
pthread_mutex_lock( &end_mutex );
if (no_more_threads()) // You have to figure this thing out to ensure no more threads
    all_threads_done = true;
pthread_cond_signal( &condition_var );
pthread_mutex_unlock( &end_mutex );

Обратите внимание, наконец, что даже когда вы делаете while, это не занятое ожидание, так как большинствовремя, когда главный поток ожидает в pthread_cond_wait, и пробуждается как раз тогда, когда какой-либо из потоков заканчивается.

0 голосов
/ 20 сентября 2011

Используйте join в любой ветке, которую хотите подождать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...