相关疑难解决方法(0)

什么时候使用volatile多线程?

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

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

c++ concurrency multithreading atomic volatile

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

多线程程序停留在优化模式下,但在-O0下正常运行

我编写了一个简单的多线程程序,如下所示:

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中-O0GC c和后打印出的结果1秒钟。但是它卡住了,在“ 释放”模式或中不打印任何内容-O1 -O2 -O3

c++ multithreading thread-safety data-race

67
推荐指数
3
解决办法
5653
查看次数

为什么在x86上对自然对齐的变量进行整数赋值?

我一直在读这篇关于原子操作的文章,它提到了32位整数赋值在x86上是原子的,只要该变量是自然对齐的.

为什么自然对齐确保原子性?

c c++ concurrency x86 atomic

28
推荐指数
2
解决办法
5386
查看次数

是否存在一个平台或情况,其中解除引用(但不使用)空指针以使空引用将表现不佳?

我目前正在使用一个使用代码的库

T& being_a_bad_boy()
{
    return *reinterpret_cast<T*>(0);
}
Run Code Online (Sandbox Code Playgroud)

在没有实际存在T的情况下引用T.这是未定义的行为,特别指出标准不支持,但它不是闻所未闻的模式.

我很好奇是否有任何示例或平台或用法表明在实践中这可能会导致问题.谁能提供一些?

c++ null reference undefined-behavior

25
推荐指数
3
解决办法
2248
查看次数

C++ 11原子x86内存排序

在C++ 0x中的一个原子变量文档中,当描述内存顺序时,它提到:

发布 - 获取订购

在强排序系统(x86,SPARC,IBM大型机)上,发布 - 获取顺序是自动的.没有为此同步模式发出额外的CPU指令,只会影响某些编译器优化...

首先是真的,x86遵循严格的内存排序?似乎效率非常低,总是强加于此.意味着每次写入和读取都有围栏?

另外,如果我在x86系统上有一个对齐的int,原子变量是否可以用于任何目的?

c++ atomic c++11

5
推荐指数
2
解决办法
1867
查看次数