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

时间:2011-01-05 20:26:35

标签: pthreads mutex

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

此代码是否正确且可移植?

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);
    }
}

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

3 个答案:

答案 0 :(得分:12)

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

pthread_mutex_lock Open Group Base Specification这样说:

  

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

答案 1 :(得分:5)

作为user562734's answer says,答案是否定的 - 您无法解锁被另一个线程锁定的线程。

要实现所需的读/写同步,您应该使用条件变量 - pthread_cond_wait()pthread_cond_signal()和相关函数。

答案 2 :(得分:0)

某些实现允许锁定和解锁线程 与众不同。

#include <iostream>
#include <thread> 
#include <mutex> 

using namespace std;

mutex m;

void f() {m.lock();   cout << "f: mutex is locked" << endl;}

void g() {m.unlock(); cout << "g: mutex is unlocked" << endl;}

main()
{
      thread tf(f);    /* start f                           */
      tf.join();       /* Wait for f to terminate           */
      thread tg(g);    /* start g                           */
      tg.join();       /* Wait for g to terminate           */
}

此程序打印

f:互斥锁被锁定 g:互斥锁已解锁

系统是Debian linux,gcc 4.9.1。 -std = C ++ 11