谁获取信号量cond_wait或pthread_mutex_lock

时间:2018-02-04 03:21:10

标签: c multithreading

线程2正在循环以获取信号量:         pthread_mutex_lock(& mutex);

线程3正在等待信号条件,pthread_cond_wait():         pthread_cond_wait(& cond,& mutex); //

线程1 释放了信号量并发送了pthread_cond_signal()://

       pthread_cond_signal( &cond ); //
        pthread_mutex_unlock( &mutex ); //

问题是: 线程1发送信号并释放信号量。如果线程2在线程3之前获得信号量怎么办?

由于

1 个答案:

答案 0 :(得分:1)

这个问题只看话题 2 就可以回答了。

for(;;){
        pthread_mutex_lock( &mutex );
}

如果互斥体从未被任何其他线程释放,则线程 2 在第一次调用 pthread_mutex_lock 时将永远阻塞。否则,如果这个线程曾经获得过锁,它会在已经持有锁的情况下调用 pthread_mutex_lock。接下来会发生什么取决于互斥锁的类型:

  1. 如果这是一个递归互斥锁,线程 2 将继续增加它在互斥锁上的持有计数。没有其他线程会获得互斥锁,因为线程 2 永远不会退出它的循环。

  2. 如果这不是递归互斥锁,则行为未定义,因为线程 2 调用了违反其前提条件的函数。如果您已经持有要获取的锁并且该锁不是递归的,则不允许调用 pthread_mutex_lock

来自对问题的较早编辑:

<块引用>

我读到当它收到条件信号时,它会锁定信号量,但是信号量已经被线程 2 抓取了?

锁定互斥锁的操作会阻塞直到可以获得互斥锁。如果另一个线程已经持有互斥锁,则在条件变量上阻塞的线程将变为在互斥锁上阻塞,并在解锁时争夺它(可能与其他等待线程一起)。