其他分享
首页 > 其他分享> > C如果一个线程写完切换bool一次,是否可以安全地在一个其他线程的循环中读取bool?

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

作者:互联网

我正在构建一个非常简单的程序作为练习.

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

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

现在主线程当然需要知道什么时候应该停止打印点并且可以查找结果.
可以使用例如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.

标签:c,multithreading,atomicity
来源: https://codeday.me/bug/20190727/1553210.html