gpt4 book ai didi

c++ - 使用 STL 容器的多线程

转载 作者:行者123 更新时间:2023-11-30 02:10:23 28 4
gpt4 key购买 nike

我有一个存储对象指针的无序映射。我不确定我是否在做正确的事情来维护线程安全。

typedef std::unordered_map<string, classA*>MAP1;
MAP1 map1;
pthread_mutex_lock(&mutexA)
if(map1.find(id) != map1.end())
{
pthread_mutex_unlock(&mutexA); //already exist, not adding items
}
else
{
classA* obj1 = new classA;
map1[id] = obj1;
obj1->obtainMutex(); //Should I create a mutex for each object so that I could obtain mutex when I am going to update fields for obj1?
pthread_mutex_unlock(&mutexA); //release mutex for unordered_map so that other threads could access other object
obj1->field1 = 1;
performOperation(obj1); //takes some time
obj1->releaseMutex(); //release mutex after updating obj1
}

最佳答案

几个想法。

如果每个存储对象确实有一个互斥锁,那么您应该尝试在存储对象的构造函数中创建该互斥锁。换句话说,为了保持封装,您应该避免让外部代码操纵该互斥锁。我会将“field1”转换为在内部处理互斥量的 setter “SetField1”。

接下来,我同意您可以将 pthread_mutex_unlock(&mutexA); 移动到 obj1->obtainMutex();

之前的评论

最后,我认为您根本不需要 obtainMutex。您的代码看起来好像只允许一个线程创建一个对象,因此只有一个线程将在对象创建期间操作内容。因此,如果我只考虑您在此处显示的少量代码,似乎根本不需要每个对象互斥锁。

关于c++ - 使用 STL 容器的多线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4654155/

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