gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-28 03:07:05 24 4
gpt4 key购买 nike

我正在使用一个库,该库使用多线程在事件发生时调用成员函数。库中的每个“处理程序”都有一个线程可以调用函数 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/

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