同时读/写单个变量的真正危险是什么?
@H_404_2@如果我使用一个线程来写一个变量而另一个线程用来读取while循环中的变量,并且如果在写入时读取变量并且使用旧值没有危险,那么还有什么危险呢?
@H_404_2@同时读/写是否会导致线程崩溃或者在发生精确的同时读/写时在低电平上发生什么?
解决方法
如果两个线程在没有适当同步的情况下访问变量,并且这些访问中至少有一个是写入,那么您将遇到数据争用和未定义的行为.
@H_404_2@未定义的行为如何表现完全取决于实现.在大多数现代架构中,您不会从硬件中获得陷阱或异常或任何东西,它会读取内容或存储内容.问题是,它不一定会读或写你所期望的.
@H_404_2@例如使用两个线程递增变量,您可以错过计数,如我在devx:http://www.devx.com/cplus/Article/42725的文章中所述
@H_404_2@对于单个编写器和单个读取器,最常见的结果是读者看到过时的值,但如果更新需要多个循环,或者变量跨缓存行分割,您可能还会看到部分更新的值.然后发生什么取决于你用它做什么 – 如果它是一个指针,你得到一个部分更新的值,那么它可能不是一个有效的指针,并且不会指向你想要的东西,然后你可能由于解除引用无效指针值而导致任何类型的损坏或错误.如果错误的指针值恰好指向内存映射的I / O寄存器,这可能包括格式化硬盘或其他不良后果….