使用C ++并发,我是否需要使用互斥?

时间:2012-08-03 19:28:36

标签: c++ multithreading thread-safety mutex

我必须设计一个从本地网络读取UDP数据的应用程序,并将数据存储在当前值表(CVT)中。

然后,将出现一个单独的线程并从CVT中读取值,按下它们,然后通过UDP发送它们。 CVT条目将包含浮动和整数等单个标量。

我的问题是,我需要多少互相排斥来保护CVT的更新/阅读?

换句话说,如果我有一个写入32位int的线程和另一个从该int读取的线程,我是否需要使用互斥量?

我不在乎读者线程是否没有获得存储的绝对最新值,我只关心在尝试读取该位置时它正在被更改。我知道关键字“volatile”在Java中用于此场景,但它在C ++中没有做同样的事情。

4 个答案:

答案 0 :(得分:3)

这里有很多取决于您使用什么类型的平台来支持线程。如果您有可用的原子类型,则可以使用它们。否则,是的,你几乎坚持使用互斥量(某种类型 - 许多平台都有多种类型)。

答案 1 :(得分:1)

当你描述这个问题时,它已经是线程安全的,前提是你只有一个写入器(假设代码在32位或更高字宽处理器上运行 - 在这种情况下32位写入是原子的)。

volatile存储修饰符告诉编译器变量具有非标准的加载存储语义 - 即它不能依赖CPU寄存器中的副本与内存中的值保持一致。
一般的副作用是禁用围绕该变量的任何优化(即,依赖于内存中的存储不会在其下面变化的那些)。结果是每次使用时从内存重新加载。

这是volatile在多线程情况下使用的少数几次之一。

答案 2 :(得分:0)

这取决于您使用的当前值表。如果您使用的是像SQLServer这样的数据库,那么您不必担心,因为数据库会处理它。

如果您正在使用文件系统,则问题仍然存在。

您可以编写基于TCP的客户端/服务器,对请求进行排队并按顺序响应它们。

如果您正在使用内存,则需要使用互斥锁。

答案 3 :(得分:0)

只要您的32位int在内存中正确对齐,并且我猜测它是因为默认情况下在大多数现代平台上,读取int实际上是线程安全的。

相关问题