gpt4 book ai didi

c++ - 线程处理不同类时,条件变量、互斥量应该在哪里声明?

转载 作者:太空宇宙 更新时间:2023-11-04 12:46:01 25 4
gpt4 key购买 nike

在这里,我已经全局声明了所有内容。不同类之间共享条件变量、互斥量应该在哪里声明?

应该遵循怎样的设计才能避免全局声明?

#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 );
}
}
}

最佳答案

通常我们在同一个类中声明条件变量和互斥量,因为我们将它们用于控制、调度和优先处理线程。我认为我们不需要全局声明条件和互斥锁。但如果您确实需要,您仍然可以在此处使用命名空间。

关于c++ - 线程处理不同类时,条件变量、互斥量应该在哪里声明?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51556528/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com