如何安全地从一个线程读取变量并从另一个线程修改它?

时间:2011-01-11 03:06:36

标签: c++ multithreading pthreads

我有一个在多个线程中使用的类实例。我正在从一个线程更新多个成员变量并从一个线程读取相同的成员变量。保持线程安全的正确方法是什么?

eg:
  phthread_mutex_lock(&mutex1)
    obj1.memberV1 = 1;
  //unlock here?

我应该在这里解锁互斥锁吗? (如果另一个线程现在访问obj1成员变量1和2,则访问的数据可能不正确,因为memberV2尚未更新。但是,如果我没有释放锁,则另一个线程可能会因为操作耗时而阻塞下方。

 //perform some time consuming operation which must be done before the assignment to memberV2 and after the assignment to memberV1
    obj1.memberV2 = update field 2 from some calculation
 pthread_mutex_unlock(&mutex1) //should I only unlock here?

由于

5 个答案:

答案 0 :(得分:1)

你的锁定是正确的。你应该提前释放锁只是为了让另一个线程继续进行(因为这会让另一个线程看到处于不一致状态的对象。)

答案 1 :(得分:1)

或许最好做一些像:

//perform time consuming calculation
pthread_mutex_lock(&mutex1)
  obj1.memberV1 = 1;
  obj1.memberV2 = result;
pthread_mutex_unlock(&mutex1)

这当然假设计算中使用的值不会在任何其他线程上修改

答案 2 :(得分:1)

答案 3 :(得分:0)

可能最好的办法是:

temp = //perform some time consuming operation which must be done before the assignment to memberV2

pthread_mutex_lock(&mutex1)
obj1.memberV1 = 1;
obj1.memberV2 = temp; //result from previous calculation
pthread_mutex_unlock(&mutex1) 

答案 4 :(得分:0)

我要做的是将计算与更新分开:

temp = some calculation
pthread_mutex_lock(&mutex1);
obj.memberV1 = 1;
obj.memberV2 = temp;
pthread_mutex_unlock(&mutex1);