C++ 互斥锁可以交叉方法/变量吗?如果是这样,为什么在这里不起作用?
Can c++ mutex cross method/variable? If so, why does it not work here?
我正在编写一个提供者-消费者程序。有许多消息队列,我想确保每个消息队列中排队的每条消息都有一个顺序递增的索引,例如<0, "msga">, <1, "msgb">, ...
。顺序保留在每个队列中,不同的队列无关紧要。
我使用 2 个哈希映射和 2 个互斥锁来执行此操作(我只想使用一个锁,但失败了(。
(i(第一个哈希映射将队列名称映射到一对<int, mutex *>
,其中int
表示每个队列的计数器,互斥锁在并发请求中保护队列。定义是
using umap_cnt = unordered_map<string, pair<int, mutex* > >;
umap_cnt counters;
(ii(第二个哈希映射将队列名称映射到实际的消息<int, MSG>
(MSG实际上是字符串(,定义是
using umap_msg = unordered_map<string, vector<pair<int, msg> > >;
umap_msg messages`;
我的逻辑是
- 在
counters
中查找队列的互斥锁,lock(( 它 - 首先使用 counter_iter-> 作为消息的索引,将 (( 它放在
messages
- 增加指数
- unlock(( 互斥锁
示例代码如下
/* File A.cpp */
using umap_msg = unordered_map<string, vector<pair<int, msg> > >;
mutex mtx;
umap_msg messages;
void put(string kname, MSG msg, int index) {
// If not using mtx here, the message would be out of order.
// lock_guard<mutex> mtx;
messages[kname].push_back(make_pair<index, msg>);
}
// Many threads runs producer()
/* File B.cpp*/
using umap_cnt = unordered_map<string, pair<int, mutex* > >
void producer(string kname, MSG msg) {
umap_cnt::iterator iter = counters.find(kname);
if (iter == counters.end())
return;
// lock the queue
iter->second.second->lock();
put(kname, msg, iter->second.first);
++iter->second.first; // increase the counter
iter->second.second->unlock();
}
问题是我发现单个锁不起作用。我必须使用 2 个互斥锁,一个在生产者中,另一个在放置中,否则我要么出现无序消息,要么出现分段错误(不知道为什么(。
我最初的目的是只使用一个锁在生产者中。每个队列都有自己的互斥锁,没有两个线程可以同时获取一个队列的锁,因此每个队列中的每条消息都应该排序。但是,结果并不是我所期望的。
为什么需要在第 7 行中增加额外的锁定?如果我确实必须使用 2 个锁,我是否可以优化它,因为 2 个锁似乎有点重?
我假设名为messages
的unordered_map
从空开始(顺便说一句,我是假设正确还是代码没有显示这部分?(,然后在第 8 行:
messages[kname].push_back(make_pair<index, msg>);
我们使用 [] 运算符写入messages
,如果密钥尚不存在,则执行插入。
并且不支持同时写入unordered_map
(请参阅此问题(,因此需要互斥锁来使这些写入按顺序进行。
相关文章:
- Qt信号和插槽如果从QRunnable或其他线程调用,则不起作用
- 如果我更改函数输入,我的递归不起作用?
- 如果在结构内部使用condition_variable,则它不起作用
- 如果使用 QToolTip::showText,则 QToolTip 样式表不起作用
- C++ 互斥锁可以交叉方法/变量吗?如果是这样,为什么在这里不起作用?
- 如果检查不起作用,则 C++
- 如果继电器在 arduino 上是常闭的,超声波传感器不起作用
- 如果WM_KEYDOWN起作用,为什么WM_KEYUP不起作用?
- 如果 x,递归不起作用,我的函数只能删除第一个元素
- 如果语句在我的代码中不起作用
- 如果流不起作用
- 如果语句在开关块中不起作用?
- Qt. 方法显示文本() 如果我在 QStyledItemDelegate 中定义了 paint() 方法不起作用
- 如果所述结构具有构造函数,则带有 new[] 的结构数组似乎不起作用
- C++ 如果要替换的句子具有"+"符号,则替换字符串功能不起作用
- 如果宏中的语句不起作用
- 为什么嵌套如果语句不起作用
- 如果条件不起作用,怎么来
- 如果后跟返回 (C++),则 cout 不起作用
- 如果在单独的方法中使用,则指针到指针的分配不起作用