正确等待线程在C中终止

时间:2015-05-13 19:42:31

标签: c pthreads

此代码通过创建执行此操作的线程来播放声音片段。当bleep()运行时,它将全局变量bleep_playing设置为TRUE。在它的主循环中,如果它注意到bleep_playing已设置为FALSE,它将终止该循环,清理(关闭文件,释放缓冲区)并退出。我不知道等待分离线程完成的正确方法。 pthread_join()不能完成这项工作。 while循环在这里不断检查bleep_id以查看它是否有效。如果不是,则继续执行。这是在允许创建下一个线程之前告诉线程清理和终止的正确且可移植的方式吗?

    if (bleep_playing) {
        bleep_playing = FALSE;
        while (pthread_kill(bleep_id, 0) == 0) {
            /* nothing */
        }
    }
    err = pthread_create(&bleep_id, &attr, (void *) &bleep, &effect);

1 个答案:

答案 0 :(得分:1)

嗯... pthread_join应该做的工作。据我记得,线程必须调用pthread_exit ...?

/* bleep thread */
void *bleep(void *)
{
    /* do bleeping */

    pthread_exit(NULL);
}


/* main thread */ 
if (pthread_create(&thread, ..., bleep, ...) == 0)
{
    /*
    **  Try sleeping for some ms !!!
    **  I've had some issues on multi core CPUs requiring a sleep
    **  in order for the created thread to really "exist"...
    */

    pthread_join(&thread, NULL);
}

无论如何,如果它没有做它的事情,你不应该轮询一个全局变量,因为它会占用你的CPU。而是创建一个互斥锁(pthread_mutex_* - 函数),它最初被"哔哔的线程"锁定和释放。在你的主线程中,你可以等待那个使你的线程睡眠的互斥锁,直到"哔哔的线程"释放互斥锁。

(或快速&和脏:在等待bleep_playing变为FALSE时睡眠一小段时间)