在一个线程中锁定互斥锁并在另一个线程中解锁它

Eug*_*mov 9 mutex pthreads

对不起我的英语 - 我是俄罗斯人.

这段代码是否正确且便携?

void* aThread(void*)
{
    while(conditionA)
    {
        pthread_mutex_lock(mutex1);
        //do something
        pthread_mutex_unlock(mutex2);
    }
}

void* bThread(void*)
{
    while(conditionB)
    {
        pthread_mutex_lock(mutex2);
        //do something
        pthread_mutex_unlock(mutex1);
    }
}
Run Code Online (Sandbox Code Playgroud)

实际上在目标应用程序中,我有三个线程 - 两个用于编写数组,一个用于读取.并且我需要在其中一个线程改变数组第三个线程后显示数组的内容.

use*_*374 13

它不是.如果线程A在线程B到达mutex_lock(2)之前到达mutex_unlock(2),那么您将面临未定义的行为.你也不能解锁另一个线程的互斥锁.

调用pthread_mutex_lock公开组基本规范是这么说的:

如果互斥锁类型为PTHREAD_MUTEX_NORMAL [...]如果某个线程尝试解锁未锁定的互斥锁或解锁的互斥锁,则会导致未定义的行为.

  • 就像它说:"如果一个线程试图解锁它没有锁定的互斥锁... UB" (4认同)

caf*_*caf 6

正如user562734的回答所说,答案是否定的 - 您无法解锁被另一个线程锁定的线程.

为了达到你想要读/写器同步,你应该使用条件变量- pthread_cond_wait(),pthread_cond_signal()以及相关的功能.

  • 信号量有时对于希望能够“解锁另一个线程的锁”的情况也很有用。实际上,这是一个很好的解决方法,因为记录在案的推荐使用pthread_atfork会导致未定义的行为。:-) (3认同)