C++ 为什么';t互斥体需要一个互斥体(该互斥体需要一个互斥体…)

C++ 为什么';t互斥体需要一个互斥体(该互斥体需要一个互斥体…),c++,multithreading,opencv,mutex,C++,Multithreading,Opencv,Mutex,我通过指针(cv::Mat和bool)将几个变量传递给几个线程,并试图理解何时需要使用互斥。我发现,如果不在cv::Mat上使用它,我的程序将崩溃(可能是因为一个线程正在写入另一个线程正在读取的内存区域),因此我为这些变量实现了互斥,并解决了这个问题 但是现在互斥量是我通过指针传递给每个线程的又一个变量。因此,在本例中,对互斥变量的处理与我需要互斥的其他变量的使用是一样的,所以互斥的特殊之处在于我不需要互斥(当然,这种情况永远持续下去,conept不起作用) 要明确的是,我的代码工作得很好,这更

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

但是现在互斥量是我通过指针传递给每个线程的又一个变量。因此,在本例中,对互斥变量的处理与我需要互斥的其他变量的使用是一样的,所以互斥的特殊之处在于我不需要互斥(当然,这种情况永远持续下去,conept不起作用)

要明确的是,我的代码工作得很好,这更多是出于教育目的

例如:

//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 );

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

通常,线程之间共享的所有变量都有一个互斥锁就足够了。互斥锁被设计为线程安全的。它们使用操作系统的底层机制,保证在锁定/解锁互斥锁时没有竞争条件。“我已经为这些变量实现了互斥锁”——不,你还没有实现互斥锁;您使用了一个互斥体。关于每个变量使用唯一互斥体而不是普通互斥体,使用多个互斥体会不会有性能提升?例如,在这个应用程序中,我不希望t_displayupdate线程在t_imagecapture线程写入捕获映像时等待读取DisplayImage。如果受这些互斥体保护的数据结构具有完全不相关的处理,您可以获得一些性能增益。否则,如果您需要同时获取两个或多个互斥体,很容易就会出现死锁,请参见“是的”,我认为我不需要指出所有的实现。我甚至不知道所有的实现,所以我将编辑以突出显示它。谢谢!此外,该网站有助于解释原子操作。关于原子操作的话题,读线程让我觉得我需要使用std::atomic作为我的布尔变量。是的,atd::atomic在处理多线程时改变了游戏规则。当需要以原子方式完成更多代码或必须保护更复杂的资源时,仍然需要互斥锁。