1

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

然后,将出现一个单独的线程并从 CVT 中读取值,对它们进行处理,然后通过 UDP 将它们发送出去。CVT 条目将由单独的标量组成,例如浮点数和整数。

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

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

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

4

4 回答 4

3

这里很大程度上取决于您使用哪种平台来支持线程。如果您有可用的原子类型,则可以使用它们。否则,是的,你几乎被一个互斥锁(某种类型的——许多平台有不止一种类型)困住了。

于 2012-08-03T19:33:07.077 回答
1

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

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

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

于 2012-08-03T19:40:07.367 回答
0

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

如果您使用的是文件系统,那么您的问题仍然存在。

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

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

于 2012-08-03T19:33:44.263 回答
0

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

于 2012-08-03T19:42:49.423 回答