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

c – 如何避免线程优化器==无限循环?

发布时间:2020-12-16 10:18:06 所属栏目:百科 来源:网络整理
导读:在今天的 code review中,我偶然发现了以下一些代码(稍微修改后发布): while (!initialized){ // The thread can start before the constructor has finished initializing the object. // Can lead to strange behavior. continue;} 这是在新线程中运行的前
在今天的 code review中,我偶然发现了以下一些代码(稍微修改后发布):

while (!initialized)
{
  // The thread can start before the constructor has finished initializing the object.
  // Can lead to strange behavior. 
  continue;
}

这是在新线程中运行的前几行代码.在另一个线程中,一旦初始化完成,它将initialized设置为true.

我知道优化器可以将其变成无限循环,但是避免这种情况的最佳方法是什么?

>挥发性 – considered harmful
>调用isInitialized()函数而不是直接使用变量 – 这会保证内存屏障吗?如果函数是内联声明的,该怎么办?

还有其他选择吗?

编辑:

应该早点提到这个,但这是需要在Windows,Linux,Solaris等上运行的可移植代码.我们主要使用Boost.Thread作为我们的便携式线程库.

解决方法

调用一个函数根本没有用;即使一个函数没有内联声明,它的主体仍然可以内联(除非是极端的东西,比如将你的isInitialized()函数放在另一个库中并动态链接它).

想到两个选项:

>声明初始化为原子标志(在C 0x中,您可以使用std :: atomic_flag;否则,您将需要查阅线程库的文档以了解如何执行此操作)>使用信号量;在另一个线程中获取它并在此线程中等待它.

(编辑:李大同)

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

    推荐文章
      热点阅读