c++多线程函数调用,通过引用传递参数

标签 c++ multithreading function reference

我正在使用一个库,该库使用多线程在事件发生时调用成员函数。库中的每个“处理程序”都有一个线程可以调用函数 MyClass::Process(const Signal& signal) . MyClass 引用了一个 Catalog类名为 cat .

内部 Process我有以下代码:

Stats stats;//simple container struct to hold values

std:string id(signal.signalId());
//set values of stats here based on the values in signal

cat->onSignalUpdate(id, stats);

来自库的文档:

It's impossible in bounds of single instance of Handler to have two user callbacks to be invoked simultaneously. However, different instances of Handler for different channels are not linked with each other, therefore invocations from different Handler instances may occur in parallel.

目录有一个成员std::map<std::string, Stats> signal_map

内部 Catalog::onSignalUpdate(const std::string& id, const Stats& stats)

std::map<std::string, Stats>::iterator it(signal_map.find(id));
if(it != signal_map.end())
{
    it->second = stats;
}

这在很多时候都有效,其中适当的 ID 映射到适当的 Stats 结构。有时我会得到不正确的匹配,其中处理程序 A 的 ID 被分配给属于处理程序 B 的结构。在我看来,该函数是并行调用的。我的印象是,在线程中,对函数的调用虽然是并行完成的,但却是重复的。是不是这样,还是在线程中通过引用传递值有问题?

最佳答案

如果没有针对多个线程同时修改 map 的某种形式的保护,您无法从多个线程更新 std::map。你需要一个互斥锁或类似的东西。特别是,如果 id 是“新的”,那么 map 中的底层数据结构(通常是“RB 树”)将被更改。这绝不能从多个线程完成。您也无法在树被修改时访问树以“读取”,因为树中的条目可能是“半更新的”(例如,下一个元素指向未正确填充的元素或一些这样的)。

关于c++多线程函数调用,通过引用传递参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19414239/

相关文章:

c++ - 在 C++ 中返回 char * 数组

java - 主线程可以在 RESTful Web 服务中结束,而工作线程继续吗?

c++ - 单个 C++ vector 中的多种类型

c++ - 我必须在构造函数中初始化所有内容吗?

c++ - 下一代 std::tie

java - 使用线程和/或任务更新 JavaFx Gui

python - 使用python的调度程序

java - 如何制作一个可以在java中执行一些常用功能的公共(public)模块?

javascript - 覆盖 craftyjs 中的函数

javascript - 如何在 Javascript 中创建异步函数?