dav*_*mas 5 c++ multithreading thread-local-storage
我在C++中使用协同程序的自定义实现(编译器g ++,在ARM上).协程可以通过调用move_to_thread函数(或其他方式,从一个线程迁移到另一个线程,但这将让我说明我的观点).我过于简单了,但有点像这样:
__thread int x = 0;
void f() {
x = 5;
// do some more work on current thread (thread 1, say)
move_to_thread(2);
// do more work, now on thread 2
int y = x; // with optimization, I'm getting the wrong x
}
Run Code Online (Sandbox Code Playgroud)
我遇到的问题是调用move_to_thread之前和之后完成的工作使用线程局部变量(使用__thread).在使用优化进行编译时,在线程2上运行的代码仍然访问线程1的线程局部变量而不是它自己的变量.这是因为对线程局部变量的访问执行以下操作:
但是,在启用优化的情况下,(1)和(2)正在针对第二次访问进行优化,因为编译器假定在特定线程上开始运行的函数将保留在该线程上.我的代码不适用这种假设.
如何在调用move_to_thread之前和之后让编译器查看正确的线程本地存储,而不完全取消优化?
如果您尝试按如下方式声明变量会发生什么:
__thread int volatile x = 0;
Run Code Online (Sandbox Code Playgroud)
这应该可以防止编译器缓存该值(尽管我不确定 volatile 如何与 __thread 交互)。