如何解决我可以从线程B读取相同的变量时从线程A写入变量吗?
| 这个问题已经在这里有了答案:解决方法
您似乎在问什么叫良性竞赛。
例如,考虑一个表示进度值的整数变量,该值在0到100的范围内。从一个线程读取它的同时,从另一个线程递增。您不介意在写之前读取值还是在写之后读取值。您很快就会再次阅读它,然后您将在写入后从中获取值。
在那种情况下,种族是良性的。但是,所谓的撕裂可能不是良性的。硬件可能允许您读取该值,而另一线程只写入了部分内存。
例如,写入线程可以写入低位字,然后发生两个字的读取,然后写入高位字。撕裂会导致错误。
硬件确实提供了有关撕裂的保证,但是它们在体系结构之间有所不同。例如,x86具有原子访问权限,即无撕裂,可访问4字节对齐的4字节宽数据。
如果您正在编写可移植的代码,那么您将陷入困境,因为当前的标准不能保证原子性。如果可以在硬件平台上进行假设,那么您就可以利用良性竞争。
, 您可以在没有互斥锁的情况下进行阅读,但不能进行书写。如果多个线程将写入您的变量,则需要某种同步机制来保护它。
如果线程B在线程A完成写入之前读取,则如果它不是简单类型而是某种复杂类型,则可能会出现不一致的状态。
, 您没有提到平台,但是如果您使用的是Windows,则在处理较简单的类型时,绝对应该查看
::Interlocked...
系列SDK函数。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。