Yar*_*eli 8 c c++ multithreading mutex
我正在使用pthread_mutex_t进行锁定.
pthread_mutex_t m_lock;
void get1() {
cout<<"Start get 1"<<endl;
pthread_mutex_lock(&m_lock);
get2();
pthread_mutex_unlock(&m_lock);
cout<<"End get 1"<<endl;
}
void get2() {
cout<<"Start get 2"<<endl;
pthread_mutex_lock(&m_lock); // The program actually stops here because it waits to m_lock to be unlock from get1 function.
pthread_mutex_unlock(&m_lock);
cout<<"End get 2"<<endl;
}
// The thread call to run function
void* run(void* p) {
get1();
}
Run Code Online (Sandbox Code Playgroud)
假设我只有一个调用run函数的线程,所以:get1锁定m_lock并调用get2,但是当它试图锁定m_lock时,它等待锁定将被解锁(某些事情没有发生)我们得到了一个僵局.
我的问题是,当在get1中锁定锁的同一个线程不需要等待get2中的锁(因为它是同一个线程)时,我怎么能避免这种情况?
例如,在Java中,当您使用synchornized时,这种情况永远不会发生.
public Test implements Runnable {
public void get1() {
System.out.println("Start get 1");
synchronized (this) {
get2();
}
System.out.println("End get 1");
}
public void get2() {
System.out.println("Start get 2");
synchronized (this) {
}
System.out.println("End get 2");
}
@Override
public void run() {
get1();
}
}
Run Code Online (Sandbox Code Playgroud)
这里没有僵局.
我想在我的C代码中得到相同的结果.
谢谢.
Ami*_*ory 12
正如Kami Kaze在评论中指出的那样,如果这是你的完整例子,那么这是一个非问题:只有一条路径通向get2,而且这条路径已经获得了互斥量; 只是省略第二次获取它.
但是,一般来说,可以考虑不清楚的情况.在这种情况下,您可以使互斥锁递归/重入:
在计算机科学中,可重入互斥(递归互斥,递归锁定)是特殊类型的互斥(互斥)设备,可以被同一进程/线程多次锁定,而不会导致死锁.
在您的设置中,这将通过pthread_mutexattr_settype:
pthread_mutexattr_settype(&m_lock, PTHREAD_MUTEX_RECURSIVE);
Run Code Online (Sandbox Code Playgroud)