在我的代码中我有以下结构:
父线程
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中有任何数据类型或技术可以解决这个问题。
答案 0 :(得分:2)
没有内置的基本 类型 可以保证线程安全,无论多小。即使您正在使用bool
或unsigned char
,也不能保证读取和写入都是原子的。换句话说:如果有更多的线程独立地使用相同的内存,则有可能一个线程只能部分覆盖此内存而另一个线程读取垃圾值〜在这种情况下行为未定义
您可以使用mutex
用lock
和unlock
调用来封装关键部分以确保相互排斥 - 只有一个线程可以执行该代码。对于更复杂的同步,有信号量,条件变量甚至模式/习惯用法描述如何使用这些来处理同步(灯开关,< 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的原语来处理测试和设置,但正常的解决方案是在访问共享资源时锁定,甚至是布尔值。