C ++ UNIX:线程:使主线程等待或休眠直到处理结束 - 主线程不知道pthread_t引用

时间:2011-09-20 11:12:50

标签: c++ multithreading unix pthreads

sc-> start_server运行一个无限循环,其中在一个线程中调用MyClass处理方法。 如何在main中替换while(true)语句,以便我的程序等待所有线程终止?

编辑:使用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 个答案:

答案 0 :(得分:3)

通常的方法(至少在pthreads中)是:

  1. 您有几个pthread_t对运行线程的引用。
  2. 而不是最后的while循环,等待所有线程完成类似于pthread_join(threadX, NULL);的所有内容。
  3. 在你的情况下,我没有看到任何获取线程的API,但是一旦你掌握了运行的线程(可能以某种方式询问sc),代码就会类似。

    修改

    如果您只是想等待一个条件,那么条件变量很容易。假设你有这些:

    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等待的大部分时间都在被唤醒当任何线程结束时。

答案 1 :(得分:0)

在您要等待的任何主题上使用join