正如我最近发布的这个答案所示,我似乎对volatile多线程编程环境中的实用程序(或缺乏实用程序)感到困惑.
我的理解是这样的:每当一个变量可以在访问它的一段代码的控制流之外被改变时,该变量应该被声明为volatile.信号处理程序,I/O寄存器和由另一个线程修改的变量都构成这种情况.
所以,如果你有一个全局int foo,并且foo由一个线程读取并由另一个线程原子设置(可能使用适当的机器指令),则读取线程看到这种情况的方式与它看到由信号处理程序调整的变量或由外部硬件条件修改,因此foo应该声明volatile(或者,对于多线程情况,使用内存隔离负载访问,这可能是一个更好的解决方案).
我怎么错,哪里错了?
我正在尝试理解c ++ 11中的内存防护,我知道有更好的方法可以做到这一点,原子变量等等,但是想知道这种用法是否正确.我意识到这个程序没有做任何有用的事情,我只是想确保fence功能的使用做了我认为他们做的事情.
基本上,该版本确保在围栏之前在此线程中所做的任何更改对于围栏之后的其他线程可见,并且在第二个线程中对变量的任何更改在围栏之后的线程中是否可见?
我的理解是否正确?或者我完全错过了这一点?
#include <iostream>
#include <atomic>
#include <thread>
int a;
void func1()
{
for(int i = 0; i < 1000000; ++i)
{
a = i;
// Ensure that changes to a to this point are visible to other threads
atomic_thread_fence(std::memory_order_release);
}
}
void func2()
{
for(int i = 0; i < 1000000; ++i)
{
// Ensure that this thread's view of a is up to date
atomic_thread_fence(std::memory_order_acquire);
std::cout << a;
}
}
int main()
{
std::thread t1 …Run Code Online (Sandbox Code Playgroud) 我对C语言中的volatile有疑问.
我读了一些教程,但仍然无法弄清楚,有些人说,volatile告诉编译器优化器,不应该以某种方式优化涉及这个变量的操作.这意味着只要变量的值在寄存器中发生变化,该值就会影响内存.
而且有些人说volatile是指可以通过此代码之外的方式更改值.
我无法理解第二种说法,因此可以通过此代码之外的方式更改volatile变量?怎么样?这两个说对了吗?
有谁知道在现代x86系统上将哪种类型的CPU缓存行为或策略(例如,不可缓存的写入组合)分配给内存映射文件支持的区域?
有没有办法检测是哪种情况,并可能覆盖默认行为?
Windows和Linux是您感兴趣的主要操作系统.
(编者注:此问题以前被称为内存映射I/O,但该短语具有不同的特定技术含义,特别是在谈论CPU缓存时.即与负载通信的实际I/O设备,如NIC或视频卡/商店.
这个问题实际上是关于什么样的内存mmap(some_fd, ...),当你不使用MAP_ANONYMOUS并且它由磁盘上的常规文件支持时.)
对于在线程之间传递消息,我正在寻找具有以下属性的并发队列:
多个生产者,一个消费者.
该concurrent_bounded_queueTBB会提供,但我正在寻找替代方案,以避免TBB的额外的依赖.
该应用程序使用C++ 11和boost.我在找不到任何合适的东西.有什么选择?