相关疑难解决方法(0)

什么时候使用volatile多线程?

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

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

c++ concurrency multithreading atomic volatile

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

我什么时候真的需要使用原子<bool>而不是bool?

不是atomic<bool>多余的,因为bool它本质上是原子的吗?我认为不可能有部分修改的bool值.我什么时候真的需要用atomic<bool>而不是bool

c++ atomicity c++11 stdatomic

80
推荐指数
6
解决办法
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
查看次数

C++:std :: atomic <bool>和volatile bool

我只是在阅读Anthony Williams的行动书中的C++并发性.有这个经典的例子有两个线程,一个产生数据,另一个消耗数据,AW写的代码很清楚:

std::vector<int> data;
std::atomic<bool> data_ready(false);

void reader_thread()
{
    while(!data_ready.load())
    {
        std::this_thread::sleep(std::milliseconds(1));
    }
    std::cout << "The answer=" << data[0] << "\n";
}

void writer_thread()
{
    data.push_back(42);
    data_ready = true;
}
Run Code Online (Sandbox Code Playgroud)

我真的不明白为什么这个代码与我使用经典的挥发性bool而不是原子的不同.如果有人能够对这个问题敞开心扉,我将不胜感激.谢谢.

c++ multithreading

16
推荐指数
3
解决办法
2万
查看次数

如果使用“memory_order_relaxed”检查,为什么要使用“memory_order_seq_cst”设置停止标志?

Herb Sutter 在他的“原子<>武器”演讲中展示了原子的几个示例用途,其中之一可归结为以下内容:(视频链接,带时间戳)

  • 一个主线程启动多个工作线程。

  • 工人检查停止标志:

    while (!stop.load(std::memory_order_relaxed))
    {
        // Do stuff.
    }
    
    Run Code Online (Sandbox Code Playgroud)
  • 主线程最终执行此操作stop = true;(注意,使用 order= seq_cst),然后加入工作线程。

Sutter 解释说,使用 order= 检查标志relaxed是可以的,因为谁在乎线程是否会因稍大的延迟而停止。

但为什么要stop = true;在主线程中使用呢seq_cst?幻灯片上说这是故意不这样做relaxed,但没有解释原因

看起来它会起作用,可能会有更大的停止延迟。

这是性能和其他线程看到标志的速度之间的折衷吗?即,由于主线程仅设置标志一次,我们不妨使用最强的排序,以尽快传达消息?

c++ concurrency stdatomic

13
推荐指数
1
解决办法
710
查看次数