如果有两个线程访问全局变量,那么许多教程都说使变量volatile变为阻止编译器将变量缓存在寄存器中,从而无法正确更新.但是,访问共享变量的两个线程是通过互斥锁来调用保护的东西不是吗?但是在这种情况下,在线程锁定和释放互斥锁之间,代码处于一个关键部分,只有那个线程可以访问变量,在这种情况下变量不需要是volatile?
那么多线程程序中volatile的用途/目的是什么?
我编写了一个简单的多线程程序,如下所示:
static bool finished = false;
int func()
{
size_t i = 0;
while (!finished)
++i;
return i;
}
int main()
{
auto result=std::async(std::launch::async, func);
std::this_thread::sleep_for(std::chrono::seconds(1));
finished=true;
std::cout<<"result ="<<result.get();
std::cout<<"\nmain thread id="<<std::this_thread::get_id()<<std::endl;
}
Run Code Online (Sandbox Code Playgroud)
它通常表现在调试模式下在Visual Studio中或-O0在GC c和后打印出的结果1秒钟。但是它卡住了,在“ 释放”模式或中不打印任何内容-O1 -O2 -O3。
我目前正在使用一个使用代码的库
T& being_a_bad_boy()
{
return *reinterpret_cast<T*>(0);
}
Run Code Online (Sandbox Code Playgroud)
在没有实际存在T的情况下引用T.这是未定义的行为,特别指出标准不支持,但它不是闻所未闻的模式.
我很好奇是否有任何示例或平台或用法表明在实践中这可能会导致问题.谁能提供一些?
在C++ 0x中的一个原子变量文档中,当描述内存顺序时,它提到:
发布 - 获取订购
在强排序系统(x86,SPARC,IBM大型机)上,发布 - 获取顺序是自动的.没有为此同步模式发出额外的CPU指令,只会影响某些编译器优化...
首先是真的,x86遵循严格的内存排序?似乎效率非常低,总是强加于此.意味着每次写入和读取都有围栏?
另外,如果我在x86系统上有一个对齐的int,原子变量是否可以用于任何目的?