pthread_mutex_lock当它是同一个线程时如何不锁定

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)