在同一个线程上提升互斥锁定

ara*_*ao6 4 c++ lua boost mutex

我是升级库的新手,它是如此惊人的库!此外,我是互斥的新手,所以请原谅我,如果我犯了新手的错误.

无论如何,我有两个函数叫FunctionOneFunctionTwo.FunctionOne并且FunctionTwo由不同的线程异步调用.所以这就是发生的事情:在FunctionOne,我在函数的开头锁定一个全局互斥锁,并在函数结束时解锁全局互斥锁.同样的事情FunctionTwo.

现在问题在于:有时,FunctionOne并且FunctionTwo被称为相隔不到几毫秒(但并非总是如此).因此,FunctionOne开始执行并FunctionTwo执行中途.当FunctionTwo 锁定互斥体,整个线程FunctionOneFunctionTwo上停止,所以FunctionOne被套牢中途通过,并在自己的线程等待FunctionTwo,直到永远.所以,总结一下:

  • 功能1锁定互斥锁并开始执行代码.
  • 函数2在几毫秒后调用并锁定互斥锁,冻结线程函数1和2打开​​.
  • 现在func 1被中途停留并且线程被冻结,因此func 1永远不会完成并且互斥锁永远被锁定,等待func 1完成.

在这种情况下做什么?这是我的代码:

boost::mutex g_Mutex;
lua_State* L;

// Function 1 is called from some other thread
void FunctionOne()
{
    g_Mutex.lock();

    lua_performcalc(L);

    g_Mutex.unlock();
}

// Function 2 is called from some other thread a few ms later, freezing the thread
// and Function 1 never finishes
void FunctionTwo()
{
    g_Mutex.lock();

    lua_performothercalc(L);

    g_Mutex.unlock();
}
Run Code Online (Sandbox Code Playgroud)

Joh*_*ica 8

这些函数是否可以重入,这样FunctionOne会在持有互斥锁的同时调用自身或FunctionTwo?反之亦然,FunctionTwo锁定互斥锁,然后在互斥锁被锁定时调用FunctionOne/FunctionTwo?

  • 如果没有,那么你不应该从同一个线程调用这两个函数.如果你打算阻止FunctionTwo直到FunctionOne完成,那么在同一个线程上调用它是错误的.如果lua_performcalc最终调用FunctionTwo,就会发生这种情况.这是他们可以在同一个线程上调用的唯一方法.

  • 如果是这样,那么你需要一个recursive_mutex.常规互斥锁只能锁定一次; 从同一个线程再次锁定它是一个错误.递归互斥锁可以被单个线程多次锁定并被锁定,直到线程调用解锁相同的次数.

在任何一种情况下,都应该避免显式调用lock和unlock.如果抛出异常,则互斥锁将无法解锁.最好使用RAII风格的锁定,如下所示:

{
    boost::recursive_mutex::scoped_lock lock(mutex);

    ...critical section code...

    // mutex is unlocked when 'lock' goes out of scope
}
Run Code Online (Sandbox Code Playgroud)