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

c – 我可以从线程A写一个变量,而我从线程B读取相同的变量

发布时间:2020-12-16 10:29:30 所属栏目:百科 来源:网络整理
导读:参见英文答案 Do I need to guard a variable that is written by one thread and read by many?????????????????????????????????????2个 这将在没有互斥量的情况下完成.我只是想知道它是否是线程安全的,即程序不会崩溃或类似的东西.我并不真正关心变量在读
参见英文答案 > Do I need to guard a variable that is written by one thread and read by many?????????????????????????????????????2个
这将在没有互斥量的情况下完成.我只是想知道它是否是线程安全的,即程序不会崩溃或类似的东西.我并不真正关心变量在读取时可能处于错误状态,因为后果不是致命的(只有在没有必要的情况下才会产生小数据结构的副本)
我正在使用Qt.

这是可能发生的上下文:从主线程,我将设置一个both,它是qthread的成员.在我将bool设置为true时或之后,qthread可以在使用此bool的函数中(这是主线程和qthread使用的函数,所有内容都已受到保护和同步,以便不具有两个线程同时运行的函数)

有点想起来,因为这个bool只用于主线程,不管怎样我会检查哪个线程在函数中,哪个应该解决,但我仍然很好奇.

解决方法

你好像在问什么叫做良性种族.

例如,考虑一个整数变量,表示0到100范围内的进度值.您可以在从另一个线程递增的同时从一个线程读取它.您不介意在写入之前读取值还是在写入之后读取值.你很快就会再读一遍,然后你会在写完之后得到它的价值.
在那种情况下,比赛是良性的.然而,可能不是良性的是被称为撕裂的东西.硬件可能允许您读取值,而另一个线程只写入了部分内存.

例如,写入线程可以写低字,然后发生两个字的读取,然后写入高字.撕裂会导致错误.

硬件确实提供了有关撕裂的保证,但它们在架构之间有所不同.例如,对于4字节对齐的4字节宽数据,x86具有原子访问,即没有撕裂.

如果您正在编写可移植代码,那么您处于相当棘手的水域,因为当前的标准不能保证原子性.如果您可以在硬件平台上做出假设,那么您可以利用良性竞赛.

(编辑:李大同)

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

    推荐文章
      热点阅读