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

C如果一个线程写完切换bool一次,是否可以安全地在一个其他线程的

发布时间:2020-12-16 10:04:49 所属栏目:百科 来源:网络整理
导读:我正在构建一个非常简单的程序作为练习. 这个想法是通过递归迭代其所有内容,并总结目录(及其子目录)中包含的所有文件的大小来计算目录的总大小. 为了向用户显示程序仍在工作,此计算在另一个线程上执行,而主线程打印一个点.每秒一次. 现在主线程当然需要知道
我正在构建一个非常简单的程序作为练习.

这个想法是通过递归迭代其所有内容,并总结目录(及其子目录)中包含的所有文件的大小来计算目录的总大小.

为了向用户显示程序仍在工作,此计算在另一个线程上执行,而主线程打印一个点.每秒一次.

现在主线程当然需要知道什么时候应该停止打印点并且可以查找结果.
可以使用例如std :: atomic< bool>做(假);并将其传递给将执行计算的线程,一旦完成将其设置为true.但我想知道在这个简单的情况下(一个线程写完一次,一个线程周期性地读取直到非零),有必要使用原子数据类型.显然,如果多个线程可能写入它,则需要对其进行保护.但在这种情况下,只有一个写作线程和一个阅读线程.

是否有必要在这里使用原子数据类型,或者它是否过度,是否可以使用普通数据类型?

解决方法

是的,这是必要的.规则是如果两个线程可能同时访问同一个内存,并且至少有一个线程是编写器,那么您就有数据竞争.具有数据争用的程序的任何执行都具有未定义的行为.

C 14标准的相关引用:

1.10 / 23

The execution of a program contains a data race if it contains two potentially concurrent conflicting actions,at least one of which is not atomic,and neither happens before the other,except for the special case for signal handlers described below. Any such data race results in undefined behavior.

1.10 / 6

Two expression evaluations conflict if one of them modifies a memory location (1.7) and the other one accesses or modifies the same memory location.

(编辑:李大同)

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

    推荐文章
      热点阅读