我的测试代码如下,我发现只有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("":::"记忆")"太低了.
还有更好的选择吗?
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泄漏呢?