使用pthreads避免布尔变量的数据争用

时间:2014-01-31 15:37:48

标签: c++ multithreading parallel-processing synchronization pthreads

在我的代码中我有以下结构:

父线程

somedatatype thread1_continue, thread2_continue; // Does bool guarantee no data race?

主题1:

while (thread1_continue) {
  // Do some work
}

主题2:

while (thread2_continue) {
  // Do some work
}

所以我想知道哪个数据类型应该是thread1_continue或thread2_continue以避免数据竞争。如果pthread中有任何数据类型或技术可以解决这个问题。

2 个答案:

答案 0 :(得分:2)

没有内置的基本 类型 可以保证线程安全,无论多小。即使您正在使用boolunsigned char,也不能保证读取和写入都是原子的。换句话说:如果有更多的线程独立地使用相同的内存,则有可能一个线程只能部分覆盖此内存而另一个线程读取垃圾值〜在这种情况下行为未定义

您可以使用mutexlockunlock调用来封装关键部分以确保相互排斥 - 只有一个线程可以执行该代码。对于更复杂的同步,有信号量条件变量甚至模式/习惯用法描述如何使用这些来处理同步(灯开关,< em> turniket 等)。只需了解更多相关信息,可以找到一些简单的例子here:)

请注意,可能有一些更复杂的类型/包装器可以包装对象的访问方式 - 例如C ++ 11中的std::atomic模板,除了内部处理同步之外什么都不做您不需要明确地这样做。使用std::atomic可以保证:“如果一个线程写入原子对象而另一个线程从中读取,则行为是明确定义的”

答案 1 :(得分:0)

对于布尔(和其他人),请务必避免

thread 1 loop
{
  do actions1;
  myFlag = true;
  do more1;
}

thread 2 loop
{
  do actions2;
  if (myFlag)
  {
    myFlag = false;
    do flagged actions;
  }
  do more2;
}

这几乎总是有效,直到myBool由thread1设置,而thread2在检查和重置myBool之间。有依赖于CPU的原语来处理测试和设置,但正常的解决方案是在访问共享资源时锁定,甚至是布尔值。