c++ - 当协程切换线程时,如何强制 Linux 上的 g++ 更新线程指针(用于 TLS)?

标签 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
}

我遇到的问题是调用 move_to_thread 之前和之后完成的工作使用线程局部变量(使用 __thread)。当使用优化编译时,在线程 2 上运行的代码仍然访问线程 1 的线程局部变量而不是它自己的。这是因为对线程局部变量的访问会执行以下操作:

  1. 查找当前线程的TLS线程指针
  2. 将x的TLS偏移量添加到线程指针
  3. 将这个地址的内存作为x

但是,启用优化后,(1) 和可能 (2) 将针对第二次访问进行优化,因为编译器假定开始在特定线程上运行的函数将保留在该线程上。此假设不适用于我的代码。

如何让编译器在调用 move_to_thread 之前和之后查看正确的线程本地存储,而不完全取消优化?

最佳答案

如果您尝试按如下方式声明您的变量,会发生什么情况:

__thread int volatile x = 0;

这应该会阻止编译器缓存该值(尽管我不确定 volatile 如何与 __thread 交互)。

关于c++ - 当协程切换线程时,如何强制 Linux 上的 g++ 更新线程指针(用于 TLS)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19811474/

相关文章:

c++ - 创建窗口中的 hInstance

c++ - C++ 11 thread_local变量是否自动静态?

c++ - _Deref_ 和 _Outptr_ sal 注释

android - Android注解中Main Thread、Ui Thread、WorkerThread、Binder Thread的区别

python - 在 Python 中将进程作为线程与网络一起使用

java - 在java中如何从线程中获取返回值?

c++ - 每线程单例使用 thread_local 存储

c - 确定 `_Thread_local` 标识符链接的正式方法是什么?

java - 有没有办法使用 JNI 从 Java 调用 C++ 的 STL 库?

c++ - 如何使用 MFC 增加/减少位图的对比度?