2014-09-02 31 views

回答

2

对于pthread_cond_signal() ...如果没有线程就在那个时候等待,没有发生,在所有什么 - 尤其是信号被完全遗忘,这是因为如果它有从来没有发生过

恕我直言POSIX“条件变量”被错误地命名,因为名称暗示“条件变量”有一个值,并且假设该值可能收集未决信号是很自然的。没有东西会离事实很远。 (为此,您需要“信号灯”。)

与“条件”关联的“状态”是重要的。这需要等待“状态”的线程有一个特定的值会:

pthread_mutex_lock(foo_mutex) ; 

    while (...state not as required...) 
    pthread_cond_wait(foo_cond, foo_mutex) ; 

    ...perhaps update the state... 

    pthread_mutex_unlock(foo_mutex) ; 

哪些更新了“状态”,使得其他线程现在可以继续,将一个线程:

pthread_mutex_lock(foo_mutex) ; 

    ...update the state... 

    if (...there may be a waiter...) 
    pthread_cond_signal(foo_cond) ; 

    pthread_mutex_unlock(foo_mutex) ; 

NB:该标准明确允许启动一个,一些或所有的服务员......因此服务员中的while(...)循环......以及“声称”信号需要更新状态的服务员,以便任何其他线程将循环在那while (...)