c - 2 个以上线程写入/读取变量的真正危险

标签 c pthreads

同时读/写单个变量的真正危险是什么?

如果我在 while 循环中使用一个线程写入一个变量,另一个线程读取该变量,并且如果在写入时读取该变量并且使用旧值则没有危险这里还有什么危险?

同步读/写是否会导致线程崩溃,或者当发生完全同时读/写时在低级别会发生什么?

最佳答案

如果两个线程在没有适当同步的情况下访问一个变量,并且这些访问中至少有一个是写操作,那么就会出现数据竞争和未定义的行为。

未定义行为的表现方式完全取决于实现。在大多数现代架构中,您不会从硬件中获得陷阱或异常或任何东西,它会读取某物,或存储某物。问题是,它不一定会读取或写入您期望的内容。

例如使用两个线程递增一个变量,您可能会错过计数,如我在 devx 的文章中所述:http://www.devx.com/cplus/Article/42725

对于一个作者和一个读者,最常见的结果是读者看到一个陈旧的值,但如果更新需要多个周期,或者变量被拆分,您也可能会看到部分更新的值缓存行。然后会发生什么取决于你用它做什么---如果它是一个指针并且你得到一个部分更新的值那么它可能不是一个有效的指针,并且无论如何都不会指向你想要的东西,然后你可能由于取消引用无效的指针值而导致任何类型的损坏或错误。如果错误的指针值恰好指向内存映射的 I/O 寄存器,这可能包括格式化您的硬盘或其他不良后果....

关于c - 2 个以上线程写入/读取变量的真正危险,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5927292/

相关文章:

c - 如何将所有子部件移动到另一个容器

C 请求用户txt文件,保存在数组中,并以txt输出

c - 虚拟分配粒度和页面大小

c++ - 如果父线程 id 没有作为 pthread_create 的参数传入,是否有可能从 C/C++ 的线程内获取父线程 id?

C++ pthread同步和线程的多次唤醒

在 Unix 上用 C 取消 UDP 接收

c - 释放动态分配的二维结构

c - 测量 MSP430 引脚上的时钟频率

c - 如何使 pthreads 池运行任意例程

c - 使用 pthread_cancel() 时内存泄漏