对不起我的英语 - 我是俄罗斯人。
此代码是否正确且可移植?
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);
}
}
实际上在目标应用程序中我有三个线程 - 两个用于编写数组,一个用于读取。我需要在其中一个线程改变数组第三个线程后显示数组的内容。
答案 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