加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c – 当协同程序切换线程时,如何强制Linux在Linux上更新线程指针

发布时间:2020-12-16 05:07:02 所属栏目:百科 来源:网络整理
导读:我在C中使用协同程序的自定义实现(编译器g,在ARM上).协程可以通过调用move_to_thread函数(或其他方式,从一个线程迁移到另一个线程,但这将让我说明我的观点).我过于简单了,但有点像这样: __thread int x = 0;void f() { x = 5; // do some more work on curr
我在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的线程局部变量而不是它自己的变量.这是因为对线程局部变量的访问执行以下操作:

>查找当前线程的TLS线程指针
>将x的TLS偏移量添加到线程指针
>将此地址的内存用作x

但是,在启用优化的情况下,(1)和(2)正在针对第二次访问进行优化,因为编译器假定在特定线程上开始运行的函数将保留在该线程上.我的代码不适用这种假设.

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

解决方法

如果您尝试按如下方式声明变量会发生什么:
__thread int volatile x = 0;

这应该会阻止编译器缓存该值(尽管我不确定它与__thread的易交互作用).

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读