单个线程可以双锁一个互斥锁吗?

时间:2018-02-09 23:43:50

标签: c++ multithreading mutex

如果我希望线程暂停一段时间,直到满足某些条件,我可以双重锁定互斥锁吗?

这是我现在正在使用的想法的基本示例:

class foo
{
public:
    static std::mutex processingMutex;

    void infinite_processing_loop()
    {
        processingMutex.lock();  // Lock the mutex, initially

        while(true)
        {
            if ( /*ready for this thread to process data*/ )
            {
                // ... perform one round of data processing ...
            }
            else  // NOT ready for this thread to process data
            {
                /* Pause this thread,
                   and wait for another thread to unlock this mutex
                   (when more data might be ready for processing) */

                processingMutex.lock();
            }
        }

        processingMutex.unlock();  // Will never be executed
    }
};

当处理线程试图双重锁定互斥锁时,处理线程是否会停止? 并且另一个线程可以解锁相同的互斥锁,导致暂停的处理线程恢复吗?

std::mutex是否自动识别互斥锁何时从同一处理线程锁定两次?

1 个答案:

答案 0 :(得分:4)

std::mutex通常会在第二次尝试通过所有者线程锁定时死锁。即使它没有,它也被认为是应用程序尝试使用此原语的错误。

std::recursive_mutex将允许重入锁定。因此,如果锁定两次,则需要先解锁两次才能使互斥锁可以使用互斥锁。

有一种思想流派认为,任何涉及在已经锁定之后递归获取互斥锁的设计都是一个设计缺陷。我会尝试挖掘该线程并添加它。