相关疑难解决方法(0)

什么时候使用volatile多线程?

如果有两个线程访问全局变量,那么许多教程都说使变量volatile变为阻止编译器将变量缓存在寄存器中,从而无法正确更新.但是,访问共享变量的两个线程是通过互斥锁来调用保护的东西不是吗?但是在这种情况下,在线程锁定和释放互斥锁之间,代码处于一个关键部分,只有那个线程可以访问变量,在这种情况下变量不需要是volatile?

那么多线程程序中volatile的用途/目的是什么?

c++ concurrency multithreading atomic volatile

121
推荐指数
3
解决办法
5万
查看次数

为什么通过std :: atomic使用volatile限定符?

从我从Herb Sutter其他人那里读到的内容,您会认为volatile并发编程是完全正交的概念,至少就C/C++而言.

但是,在GCC 实现中,所有std::atomic的成员函数都有volatile限定符.安东尼威廉姆斯的实施也是如此std::atomic.

那么什么是交易,我的atomic<>变量需要volatile与否?

c++ atomic volatile c++11

71
推荐指数
3
解决办法
7582
查看次数

Windows + VisualC上是否有易失性读写原子?

有一对夫妇在这个网站,询问使用是否问题volatile变量原子/多线程访问是可能的:见这里,这里,还是这里的例子.

现在,符合C(++)标准的答案显然没有.

但是,在Windows和Visual C++编译器上,情况似乎并不那么清楚.

我最近回答,并引用了官方的MSDN文档volatile

微软特定

声明为volatile的对象是(...)

  • 对volatile对象的写入(volatile write)具有Release语义; 对全局或静态对象的引用在编译二进制文件中的易失性写入之前,将在写入指令序列中的易失性对象之前发生这种情况.
  • 读取volatile对象(volatile read)具有Acquire语义; 对全局或静态对象的引用 在读取编译二进制文件中的易失性读取之后,将在读取指令序列中的易失性存储器之后发生这种情况.

这允许volatile对象用于多线程应用程序中的内存锁定和释放.

[强调我的]

现在,读到这一点,在我看来,MS编译器将处理一个易变量变量,就像std::atomic即将推出的C++ 11标准一样.

然而,在对我的回答评论中,用户Hans Passant写道:"那篇MSDN文章非常不幸,这是错误的.你不能用volatile来实现锁定,甚至不能使用微软的版本.(...)"


请注意:MSDN中给出的示例看起来很可疑,因为您通常无法在没有原子交换的情况下实现锁定.(正如亚历克斯指出的那样)这仍然留下了问题.有关此MSDN文章中给出的其他信息的有效性,特别是对于此处此处的用例.)


此外,还有Interlocked*函数的文档,尤其是InterlockedExchange带有volatile(!?)变量并进行原子读取和写入.(注意我们在SO上有一个问题 - 何时应该使用InterlockedExchange? - 没有权威性地回答是否需要这个函数来进行只读或只写原子访问.)

更重要的是,volatile上面引用的文档以某种方式暗示"全局或静态对象",我认为"真正的" 获取/释放语义应该适用于所有值. …

c++ atomic volatile memory-fences visual-c++

11
推荐指数
1
解决办法
4615
查看次数

OSAtomicIncrement32 锁定什么?

OSAtomicIncrement32 锁定什么?Dispatch_async 是否会导致原子调用对于原始变量来说不是线程安全的?

static volatile int32_t count;
...
dispatch_async(dispatch_get_main_queue(), ^{
  ...
  OSAtomicIncrement32(&count);
}
Run Code Online (Sandbox Code Playgroud)

易失性是否多余,或者即使计数始终以原子方式递增,某些线程也可以读取旧值?

编辑:不稳定的问题已由http://www.drdobbs.com/parallel/volatile-vs-volatile/212701484解决。这可以通过以下答案中的几个链接找到,但我想我会将其发布在这里以供快速参考。简而言之,“易失性”在 Java 中与 Objective-C 中的含义不同。

multithreading objective-c

2
推荐指数
1
解决办法
2081
查看次数