我有一个名为的结构的图像
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 _Visitor 的全局实例上存在数据竞争,所以我添加了一个独占锁(互斥锁)来保护 struct _visitors 中的 totalNum 和 visitorMap 字段。
现在我的问题是:添加一个独占锁来保护 struct _Visitors 中的字段就足够了吗?如果在具有多个处理器的 SMP 架构上执行,是否可以确保我的程序在任何情况下都不会遇到数据竞争?