调用pthread_cond_wait()和pthread_cond_signal会的理解()(un

2019-09-02 21:30发布

一般来说, pthread_cond_wait()pthread_cond_signal()被称为如下:

//thread 1:
pthread_mutex_lock(&mutex);
pthread_cond_wait(&cond, &mutex);
do_something()
pthread_mutex_unlock(&mutex);

//thread 2:
pthread_mutex_lock(&mutex);
pthread_cond_signal(&cond);  
pthread_mutex_unlock(&mutex);

步骤如下

  1. pthread_cond_wait(&cond, &mutex); 被调用,它解锁互斥量

  2. 线程2锁定互斥锁,并调用pthread_cond_signal()它解锁互斥量

  3. 在线程1, pthread_cond_wait()被调用,并再次锁定互斥

现在,在线程2,后pthread_cond_signal()被调用, pthread_mutex_unlock(&mutex)将运行,在我看来它要解锁现在被线程1锁定这有什么错在我的理解互斥?

此外,它还在我看来, pthread_cond_wait()只能由1相同COND-互斥对线程调用。 但有一种说法“的调用pthread_cond_signal()函数将解锁被阻挡在指定条件变量COND其(如果有的话线程被阻塞上COND)的螺纹中的至少一个”。 因此,这意味着pthread_cond_wait()可以通过多个线程对同一COND-互斥对被称为?

Answer 1:

pthread_cond_signal不会解锁互斥(?它不能因为它没有参考互斥体,所以它怎么会知道开锁的)事实上,信号不必为互斥的任何连接; 信令线程并不需要持有互斥体,虽然基于条件变量它将大多数算法。

pthread_cond_wait解锁它睡觉之前(如你注意到)的互斥体,但随后reaquires互斥(这可能需要等待),当它发出信号,它醒来之前。 因此,如果信令线程持有互斥体(通常情况下),等待的线程将不会继续进行,直到信号线也解锁互斥量。

条件瓦尔常见的用途是一样的东西:

thread 1:
    pthread_mutex_lock(&mutex);
    while (!condition)
        pthread_cond_wait(&cond, &mutex);
    /* do something that requires holding the mutex and condition is true */
    pthread_mutex_unlock(&mutex);

thread2:
    pthread_mutex_lock(&mutex);
    /* do something that might make condition true */
    pthread_cond_signal(&cond);
    pthread_mutex_unlock(&mutex);

两个线程具有互斥被保护访问某些共享数据结构。 第一个线程要等待,直到某个条件为真,则立即做一些操作(无竞争状态的机会,其他线程的状态检查和行动之间进来,使病情假。)第二个线程正在做的事情可能使病情真,所以它需要唤醒任何人,可能是在等待它。



Answer 2:

下面是一个典型的例子: 线程1正在等待的状态下,其可以通过螺纹2被满足

我们用一个互斥和一个条件。

pthread_mutex_t mutex;
pthread_cond_t condition;

线程1:

pthread_mutex_lock(&mutex); //mutex lock
while(!condition){
    pthread_cond_wait(&condition, &mutex); //wait for the condition
}

/* do what you want */

pthread_mutex_unlock(&mutex);

线程2:

pthread_mutex_lock(&mutex);

/* do something that may fulfill the condition */

pthread_mutex_unlock(&mutex);
pthread_cond_signal(&condition); //wake up thread 1

编辑

正如你可以在看到调用pthread_cond_wait手册 :

它以原子方式释放互斥并且使得调用线程阻塞条件变量COND; 原子在这里是指“原子相对于由另一个线程访问互斥,然后条件变量”。



文章来源: understanding of pthread_cond_wait() and pthread_cond_signal()