互锁读取 64 位变量

发布于 2024-12-10 01:13:34 字数 300 浏览 1 评论 0原文

我有这个 C++ 代码(VS 2008):

LONGLONG res = InterlockedIncrement64(&m_longlong);

沿着它运行,我希望能够从同一个变量读取

LONGLONG res = InterlockedWHAT?64(&m_longlong)

由于这是一个 64 位变量,简单的读取不被认为是线程安全的,但我找不到正确的 InterlockedXXX 。

我应该如何读取这个变量?

I have this c++ code (VS 2008):

LONGLONG res = InterlockedIncrement64(&m_longlong);

running along it, I would like to be able to read from the same variable

LONGLONG res = InterlockedWHAT?64(&m_longlong)

Since this is a 64-bit variable, a simple read is not considered threadsafe, yet I cannot find the correct InterlockedXXX.

How should I read this variable?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

护你周全 2024-12-17 01:13:34
LONGLONG res = InterlockedCompareExchange64(&m_longlong, 0, 0);
LONGLONG res = InterlockedCompareExchange64(&m_longlong, 0, 0);
云淡月浅 2024-12-17 01:13:34

您可以使用 InterlockedOr64 并传递零作为第二个参数。据我所知,这对 Vista 没有要求,大概是因为它是用编译器内在函数实现的。

You can use InterlockedOr64 and pass zero as the second parameter. So far as I can tell this does not have a requirement of Vista, presumably as it is implemented with compiler intrinsics.

夜声 2024-12-17 01:13:34
LONGLONG res = InterlockedOr64(&m_longlong, 0);

如果您的程序仅在 64 位上运行,您只需读取该值即可。 MSDN 指出

对正确对齐的 64 位变量的简单读取和写入在 64 位 Windows 上是原子的。

LONGLONG res = InterlockedOr64(&m_longlong, 0);

If your programm runs only on 64-Bit you can simply read the value. MSDN states that

Simple reads and writes to properly aligned 64-bit variables are atomic on 64-bit Windows.

山有枢 2024-12-17 01:13:34

在 VS 2019 中,您应该使用 __iso_volatile_load64,它是普通加载,因此它比 InterlockedCompareExchange64 更高效

With VS 2019 you should use __iso_volatile_load64, which is plain load, so it is more efficient than InterlockedCompareExchange64

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文