线程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之前获得信号量怎么办?
由于
答案 0 :(得分:1)
这个问题只看话题 2 就可以回答了。
for(;;){
pthread_mutex_lock( &mutex );
}
如果互斥体从未被任何其他线程释放,则线程 2 在第一次调用 pthread_mutex_lock
时将永远阻塞。否则,如果这个线程曾经获得过锁,它会在已经持有锁的情况下调用 pthread_mutex_lock
。接下来会发生什么取决于互斥锁的类型:
如果这是一个递归互斥锁,线程 2 将继续增加它在互斥锁上的持有计数。没有其他线程会获得互斥锁,因为线程 2 永远不会退出它的循环。
如果这不是递归互斥锁,则行为未定义,因为线程 2 调用了违反其前提条件的函数。如果您已经持有要获取的锁并且该锁不是递归的,则不允许调用 pthread_mutex_lock
。
来自对问题的较早编辑:
<块引用>我读到当它收到条件信号时,它会锁定信号量,但是信号量已经被线程 2 抓取了?
锁定互斥锁的操作会阻塞直到可以获得互斥锁。如果另一个线程已经持有互斥锁,则在条件变量上阻塞的线程将变为在互斥锁上阻塞,并在解锁时争夺它(可能与其他等待线程一起)。