如何在多线程情况下安全地访问struct字段?

时间:2012-12-21 02:45:53

标签: c++ multithreading

我有一个名为

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

1 个答案:

答案 0 :(得分:0)

如果您的数据受到互斥锁的正确保护,我认为您没有任何理由可以进行数据争用,SMP架构。

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