0

我有一个名为的结构的图像

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 架构上执行,是否可以确保我的程序在任何情况下都不会遇到数据竞争?

4

1 回答 1

0

如果您的数据受到互斥锁的适当保护,我看不出有任何理由说明您会出现数据竞争、SMP 架构与否。

尽管如此,如果您对如何管理互斥体有任何疑问,请不要犹豫,使用 valgrind 执行您的程序,它能够检测并警告您数据竞争。

于 2012-12-21T03:04:41.843 回答