在这里,我为2个条件变量使用了2个互斥体。如何确定一个互斥量足够还是需要单独的互斥量?
来源:
#include "thread_class.h"
#include <unistd.h>
#include <mutex>
#include <queue>
#include <condition_variable>
#include <iostream>
// Thread_manager class: ***************************************************************************************************************
std::queue<int> queue_m;
std::mutex mutex_k;
bool watch;
std::mutex mutex_x;
std::mutex mutex_y;
std::condition_variable cv_x;
std::condition_variable cv_y;
ThreadManager::ThreadManager() : obj_thread_B_( &B::Run, &obj_class_B_),
obj_thread_A_( &A::Run, &obj_class_A_ )
{
watch = false;
}
ThreadManager::~ThreadManager()
{
obj_thread_A_.join();
obj_thread_B_.join();
}
void A::Run()
{
while( 1 )
{
std::unique_lock<std::mutex> lk( mutex_x );
while (watch == false)
cv_x.wait( lk );
std::cout << "\nA class\n";
someint++;
queue_m.push( someint );
cv_y.notify_all();
// some time consuming operation
for (int t = 0; t < 1000000; t++)
{
}
}
}
void B::Run()
{
while( 1 )
{
std::cout << "\nB class\n";
if (queue_m.size() > 0)
{
int temp = queue_m.front();
std::cout << "\nTaken out: " << temp;
queue_m.pop();
cv_x.notify_all();
}
else
{
std::unique_lock<std::mutex> lk( mutex_y );
watch = true;
cv_x.notify_all();
cv_y.wait( lk );
}
}
}
答案 0 :(得分:1)
这取决于您处理中race condition
的总数。根据处理过程中的不同race condition
,您将决定处理所有race conditions
所需的互斥量。请阅读以下答案,这将有助于您了解race condition
。
答案 1 :(得分:1)
@Abhijit is right:这取决于您拥有多少比赛条件。确定这些的更多详细信息。
我只是画了一个例子。此示例具有 3 个竞争条件(请注意3个圆圈),因此需要 3 个单独的互斥体:
请注意您在这里有多少余地和控制权。其中大部分取决于您的特定建筑设计。您是建筑师和设计师。您可能会想出与其他人不同的解决方案和互斥量,并且每种设计都有其优缺点。 请记住:您是设计师,设计可能会有所不同。有时没有完美的设计,您只需要进行权衡即可。无论如何,上述有条理的过程将帮助您确定特定设计所需的互斥量。