小编lxy*_*cls的帖子

在C++ 11中是否有任何编译器障碍等于asm("":::"memory")?

我的测试代码如下,我发现只有memory_order_seq_cstforbade编译器重新排序.

#include <atomic>

using namespace std;

int A, B = 1;

void func(void) {
    A = B + 1;
    atomic_thread_fence(memory_order_seq_cst);
    B = 0;
}
Run Code Online (Sandbox Code Playgroud)

而其他选择memory_order_release,memory_order_acq_rel根本没有产生任何编译屏障.

我认为他们必须使用原子变量,如下所示.

#include <atomic>

using namespace std;

atomic<int> A(0);
int B = 1;

void func(void) {
    A.store(B+1, memory_order_release);
    B = 0;
}
Run Code Online (Sandbox Code Playgroud)

但我不想使用原子变量.与此同时,我认为"asm("":::"记忆")"太低了.

还有更好的选择吗?

c++ atomic lock-free memory-barriers c++11

3
推荐指数
1
解决办法
959
查看次数

如何正确停止计时器?

var timer *time.Timer

func A() {
    timer.Stop() // cancel old timer
    go B() // new timer
}

func B() {
    timer = time.NewTimer(100 * time.Millisecond)
    select {
    case <- timer.C:
    // do something for timeout, like change state
    }
}
Run Code Online (Sandbox Code Playgroud)

函数A和B都在不同的goroutine中。

假设A在RPC goroutine中。当应用程序收到RPC请求时,它将取消B中的旧计时器,并在另一个goroutine中启动新计时器。

医生说:

停止不会关闭通道,以防止错误地从通道读取数据。

那么如何打破B中的选择以避免goroutine泄漏呢?

go goroutine

2
推荐指数
1
解决办法
3204
查看次数

标签 统计

atomic ×1

c++ ×1

c++11 ×1

go ×1

goroutine ×1

lock-free ×1

memory-barriers ×1