相关疑难解决方法(0)

在C++中强制执行语句顺序

假设我有一些我想以固定顺序执行的语句.我想使用优化级别为2的g ++,因此可以重新排序某些语句.有什么工具可以强制执行某些语句排序?

请考虑以下示例.

using Clock = std::chrono::high_resolution_clock;

auto t1 = Clock::now(); // Statement 1
foo();                  // Statement 2
auto t2 = Clock::now(); // Statement 3

auto elapsedTime = t2 - t1;
Run Code Online (Sandbox Code Playgroud)

在这个例子中,重要的是语句1-3以给定的顺序执行.但是,编译器不能认为语句2独立于1和3并执行如下代码?

using Clock=std::chrono::high_resolution_clock;

foo();                  // Statement 2
auto t1 = Clock::now(); // Statement 1
auto t2 = Clock::now(); // Statement 3

auto elapsedTime = t2 - t1;
Run Code Online (Sandbox Code Playgroud)

c++ operator-precedence c++11

103
推荐指数
4
解决办法
1万
查看次数

如果使用“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
查看次数

标签 统计

c++ ×2

c++11 ×1

concurrency ×1

operator-precedence ×1

stdatomic ×1