我有一个名为
的结构的图像struct _Visitors{
int totalNum;
map<uintptr_t, Visitor*> visitorMap;
};
请注意,Visitor是一个c ++类
然后我声明一个指向struct _visitors实例的指针,即
struct _Visitors* pVisitors = NULL;
现在我有三个主题:一个主线程t1,两个工作线程t2和t3。
t1是这样的:
pVisitors = new _visitors();
t2是这样的:
while(true){
if a new visitor v enters
//pthread_mutex_lock(mtx);
pVisitors->totalNum++;
visitorMap[v.getVid()] = &v;
//pthread_mutex_unlock(mtx);
}
t3是这样的:
while(true){
if a new visitor v leaves
//pthread_mutex_lock(mtx);
pVisitors->totalNum--;
visitorMap.eraseAt[v.getVid()];
//pthread_mutex_unlock(mtx);
}
我知道线程t1和t2可能在struct _Visitors的全局实例上有数据争用,所以我添加了一个独占锁(mutex)来保护struct _visitors中的totalNum和visitorMap字段。
现在我的问题是:添加一个独占锁来保护struct _Visitors中的那些字段就够了吗?如果在具有多个处理器的SMP架构上执行,是否确保我的程序在任何条件下都不会遇到数据竞争?
答案 0 :(得分:0)
如果您的数据受到互斥锁的正确保护,我认为您没有任何理由可以进行数据争用,SMP架构。
尽管如此,如果您对如何管理互斥锁有任何疑问,请不要犹豫,使用valgrind执行程序,valgrind能够检测并警告您数据竞争。