如何在 Linux 上强制 g++ 在协程切换线程时更新线程指针(对于 TLS)
How do I force g++ on Linux to update the thread pointer (for TLS) when a coroutine switches threads?
我正在使用C++协程的自定义实现(ARM上的编译器g ++)。协程可以通过调用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
}
我遇到的问题是调用move_to_thread之前和之后完成的工作使用线程局部变量(使用 __thread
)。使用优化进行编译时,线程 2 上运行的代码仍访问线程 1 的线程局部变量,而不是其自身变量。这是因为对线程局部变量的访问执行以下操作:
- 查找当前线程的 TLS 线程指针
- 将 x 的 TLS 偏移量添加到线程指针
- 将此地址的内存用作 x
但是,启用优化后,(1) 和可能 (2) 正在针对第二次访问进行优化,因为编译器假定在特定线程上开始运行的函数将保留在该线程上。这个假设不适用于我的代码。
如何让编译器在调用move_to_thread之前和之后查看正确的线程本地存储,而不完全取消优化?
如果您尝试按如下方式声明变量,会发生什么情况:
__thread int volatile x = 0;
这应该可以防止编译器缓存该值(尽管我不确定易失性如何与__thread交互)。
相关文章:
- 发出信号以从线程更新 UI
- 为什么 beginthreadex 线程参数变量在父线程中没有更新
- Modal QprogressDialog从Worker线程更新
- 从另一个线程更新QT小部件的一种详细方法
- 从其他std ::线程更新QT GUI
- 从工作线程更新QtCharts的正确方法
- C++从异步线程更新窗口
- 线程更新全局指针时对全局指针的影响
- 从其他线程更新QT图形视图
- 从线程更新进度条的最佳方式
- 如何允许工作线程更新 X11 窗口
- Gtkmm : 如何从另一个线程更新 UI?不断
- 从多个线程更新命令行 printf 信息
- 如何从未创建该窗口的线程更新该窗口
- 按线程更新 QT
- 如何从另一个线程更新列表视图
- 从聚合线程更新QListView会使GUI卡住
- 从不同的线程更新GUI
- 从运行QML QtQuick2引擎的不同线程更新c++模型的行为
- 线程更新类对象