从多个线程更新与unordred_map中的不同现有键对应的值

时间:2017-08-09 18:01:17

标签: c++ multithreading

我的无序地图如下所示:

var napa = require('napajs');

// One-time setup. 
// You can change number of workers per your requirement. 
var zone = napa.zone.create('response-builders', { workers: 4 });

function serveRequest() {
    var request = null; 

    // Get request from queue.
    // ...

    zone.execute(() => {
        // Build the response here
        return response;
    }, [request]).then((result) => {
        // respond to user
        console.log(result.value);
    });
}

现在我明白我不能在没有同步的情况下从多个线程对这个地图进行插入/删除等操作。但是,我可以预先填充此地图,其中包含我将使用的最大可能条目,其中包含预先知道的字符串键列表和MyClass的所有nullptr。当我真的想“插入”到这个地图时,我将遍历地图,找到哪个键是nullptr并使用它。当我删除时,我会再次将值设置为nullptr。

这会有用吗?

2 个答案:

答案 0 :(得分:1)

是的,这可以起作用,因为你不会让自己受到竞争条件的影响 - 假设你没有从多个线程修改相同的元素。

find是容器成员函数的一个罕见示例,它未标记为const(因为它返回可修改的迭代器),但同时从多个线程调用仍然是安全的。

要获得有关容器线程安全的更多信息,我强烈建议您记住此页面:http://en.cppreference.com/w/cpp/container

答案 1 :(得分:0)

您的方法会触发未定义的行为,因为您可能会遇到多个线程访问现有地图元素中的MyClass指针,而其中至少有一个正在修改它的情况。

有关数据竞赛的部分(1.10.1-2)中的标准禁止读取和写入单个内存位置:

  

如果其中一个修改了内存位置而另一个读取或修改了相同的内存位置,则两个表达式评估会发生冲突。

此问题有许多方面,其中之一是线程可以访问部分构造的MyClass对象,因为对象创建在线程之间不同步。

考虑在地图上使用std::shared_mutex(C ++ 17)进行读/写访问;

不需要预先分配元素