为什么互斥锁不需要互斥锁(而互斥锁需要互斥锁...)

DrT*_*arr 4 c++ multithreading opencv mutex

我通过指针(cv::Mat 和 bool 的)将几个变量传递给几个线程,并试图了解何时需要使用互斥锁。我发现如果不在 cv::Mat 上使用它,我的程序就会崩溃(可能是因为一个线程正在写入另一个正在读取的内存区域),所以我已经为这些变量实现了互斥锁,它有解决了这个问题。

但是现在互斥体是我通过指向每个线程的指针传递的另一个变量。所以在这种情况下,对 mutex 变量的处理的使用与我需要互斥的其他变量相同,所以 mutex 有什么特别之处以至于我不需要互斥(当然还有永远和概念不起作用)。

需要明确的是,我的代码运行良好,这更多是出于教育目的。

例子:

//Common frames 
cv::Mat captureimage, displayimage;
std::mutex capturemutex, displaymutex;

//Start image capture thread
std::thread t_imagecapture( CaptureImageThread, &captureimage, &capturemutex, &exitsignal );
//Start image processor thread
std::thread t_imageprocessor( ProcessImageThread, &captureimage, &capturemutex, &exitsignal );
//Start display thread
std::thread t_displayupdate( DisplayUpdateThread, &displayimage, &displaymutex, &exitsignal );
Run Code Online (Sandbox Code Playgroud)

ste*_*anv 5

互斥锁是原子锁。它使用低级方法(CPU),例如,它可以在不中断的情况下测试和设置锁,因此它不需要外部锁来执行此操作。并且一旦设置了锁,其他线程就无法做到这一点,因此互斥锁可以保护其他资源的访问。