【发布时间】:2021-10-01 00:08:25
【问题描述】:
您好,我遇到了一个多线程场景的问题:
假设我有 3 个线程在一种函数(命名为 node_a)上运行,3 个线程在另一种函数(命名为 node_b)上运行。每个线程处理不同的输入数据。他们都在某个时间访问共享资源。
现在我要控制这些线程的访问:3个node_a线程被认为是grp_a,3个node_b线程被认为是grp_b。 grp_a和grp_b是互斥访问共享资源的,但是grp_a和grp_b本身可以同时运行。
这是我的方法:
- 我使用了两个共享计数器并使用互斥锁控制它们
- 我将 shared_timed_mutex 用于独占,将 shared 用于并发和独占
但事实证明,我没有通过打印每个线程访问共享资源的时间戳来获得独占。
下面是我的 C++14 代码:
std::mutex mtx;
std::shared_timed_mutex mtx_a,mtx_b;
atomic_int cnt_a{0},cnt_b{0};
//code for node_a
mtx_a.lock_shared();//will block if lane holds the lock.+1
bool a=0;
while(cnt_a==0) { //check if node_b threads are not running
if(mtx_b.try_lock()) {
std::unique_lock<std::mutex> lck(mtx);
cnt_a++;//multiple threads change it, need protection!
a=1;
}
}
/*
do some work here!!!!
*/
mtx_a.unlock_shared();//-1
{
std::unique_lock<std::mutex> lck(mtx);
--cnt_a;
}
if(a){
mtx_a.lock(); //block until all node_a threads are done
mtx_b.unlock(); //can only be unlocked by current thread
cnt_a=0;
mtx_a.unlock();
}
node_b 的类似代码
有人知道是什么问题吗?谢谢
【问题讨论】:
-
代码中出现了一些错误,现已修复
-
while(cnt_a==0) 是正确的
-
问题难以理解,代码可疑,难以将代码与问题联系起来。
标签: c++ multithreading c++14 mutex