这可以在没有互斥锁的情况下完成。我只是想知道它是否是线程安全的,即程序不会崩溃或类似的东西。我并不真正关心变量在读取时可能处于错误状态,因为后果不是致命的(只有在没有必要的情况下才会产生小数据结构的副本) 我正在使用Qt。
以下是可能发生的上下文:从主线程中,我将设置一个作为qthread成员的bool。在我将bool设置为true时或之后,qthread可以在使用此bool的函数中(这是主线程和qthread使用的函数,所有内容都已受到保护和同步,以便不具有函数同时由两个线程运行)
有点想起来,因为这个bool只用于主线程,无论如何我会检查哪个线程在函数中,哪个应该解决,但我仍然很好奇。
答案 0 :(得分:11)
你好像在问什么叫做良性种族。
例如,考虑一个整数变量,表示0到100范围内的进度值。您可以在从另一个线程递增的同时从一个线程读取它。您不介意在写入之前读取值还是在写入之后读取值。你很快就会再读一遍,然后你会在写完之后得到它的价值。 在那种情况下,比赛是良性的。然而,可能不是良性的是被称为撕裂的东西。硬件可能允许您读取值,而另一个线程只写入了部分内存。
例如,写入线程可以写入低位字,然后读取两个字,然后写入高位字。撕裂会导致不正确。
硬件确实提供了有关撕裂的保证,但它们在架构之间有所不同。例如,对于4字节对齐的4字节宽数据,x86具有原子访问权,即没有撕裂。
如果您正在编写可移植代码,那么您处于相当棘手的水域,因为当前的标准不能保证原子性。如果您可以在硬件平台上做出假设,那么您可以利用良性竞赛。
答案 1 :(得分:2)
你可以在没有互斥的情况下阅读,但不能写作。如果多个线程将写入您的变量,则需要使用某种同步机制来保护它。
如果线程B在线程A完成它的写入之前读取,那么如果这不是一个简单的类型,而是一些复杂的类型,则可能会出现不一致的状态。
答案 2 :(得分:1)
你没有提到一个平台,但如果你是一个Windows,那么在处理更简单的类型时你一定要看看::Interlocked...
系列的SDK函数。