【发布时间】:2017-02-16 10:05:32
【问题描述】:
我正在使用 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 函数的线程,所以: get1 锁定 m_lock 并调用 get2,但是当它试图锁定 m_lock 时,它会等待锁被解锁(不会发生的事情)并且我们遇到了死锁。
我的问题是,当锁定 get1 中的锁的同一个线程不需要等待 get2 中的锁定(因为它是同一个线程)时,我该如何避免这种情况?
例如,在 Java 中,当您使用同步时,这种情况永远不会发生。
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();
}
}
这里没有死锁。
请在我的 C 代码中得到相同的结果。
谢谢。
【问题讨论】:
-
只要把get2中的锁取出来。只有当您拥有专有权时,您才能达到这一点。我不知道java是做什么的,但是mutex意味着互斥。因此,当您拥有锁时,可以肯定没有其他线程将在其他关键区域上工作。如果中间有部分可以并行运行。您只需在需要时解锁并再次锁定。代码本身永远不会独立于使用的线程数而工作。
标签: c++ c multithreading mutex