[英]Thread safety in C++
我有关于线程安全的问题如下(我只有两个线程,其中一个线程只从地图读取,其他线程将写入和读取如图所示):
//Thread 2: the reading and writing thread
unordered_map<int, unordered_map<classA*>*>testMap;
//need lock because writing to the map?
testMap[1] = new unordered_map<int, classA*>;
//do not need lock because only reading and the other thread is only reading?
unordered_map<classA*>* ptr = testMap[1];
//need lock because writing?
(*ptr)[1] = new classA;
//do not need lock because only reading and the other thread is only reading?
classA* ptr2 = (*ptr)[1];
//din't modify the map, but modify the data pointed by the pointer stored by the map, do I need lock?
ptr2->field1 = 5;
ptr2->field2 = 6;
//end of reading and writing thread
锁定到unordered_map的正确方法是什么? 另外,我应该使用单个锁还是多个锁?
谢谢。
如果您的地图是唯一的共享资源,则只需一个互斥锁即可。
您需要锁定第一个线程中的写入,并将读取锁定在第二个线程中。 如果仅在写入时锁定地图,则第二个线程可以在您写入时读取它。
在最后一个关于指针的例子中你不需要锁,因为你不处理存储在地图中的任何数据。 编辑:事实上,它取决于你在使用指针做什么以及在哪个线程中执行它。
你应该阅读这篇很棒的文章: http : //herbsutter.com/2010/09/24/effective-concurrency-know-when-to-use-an-active-object-instead-of-a-mutex/
你需要锁定,阅读和写作。 如果您没有锁定读取,则在您阅读时可能会发生写入,并且您可能会以不一致的状态访问地图。
在你的情况下最好的是读者 - 作家锁。 这样的锁允许多个读取器同时读取但同时只读取一个写入器而写入器写入时没有读取器,反之亦然。
几件事:
我会在主地图周围锁定,然后为每个有效负载地图锁定另一个锁。 任何一个地图上的任何操作都需要获得正确级别的锁定。 我还要注意不要在管理锁的类之外返回迭代器,所以基本上你应该实现你在类中需要的所有方法。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.