c - 一个线程写入一个变量,另一个线程读取它

Posted

技术标签:

【中文标题】c - 一个线程写入一个变量,另一个线程读取它【英文标题】:c - one thread writes a variable, the other reads it 【发布时间】:2016-12-04 08:02:51 【问题描述】:

在 C 中确保当一个线程写入变量时另一个线程可以读取更新值的正确方法是什么?尽管搜索和“可能已经有你答案的问题”,但我没有找到任何答案,这给了我不是 C 的结果,而且有很多。

据我所知,C 没有涵盖它,所以我不得不依赖平台特定的调用,但我正在寻找跨平台可移植的东西。我知道我可以使用锁,但我认为这会产生一些不必要的开销,因为我确信一个线程只需要从变量中读取,而另一个线程只需要写入变量。我希望读取变量的线程在修改后立即知道。是否有正确的非平台特定方法来做到这一点?谢谢

【问题讨论】:

Volatile 应该足够了,如果不涉及其他变量的话。通常的问题是当涉及多个变量时,由于编译器和/或处理器优化,操作可能会乱序执行。 @rcgldr:我可能不会。将变量指定为 volatile 并不会阻止一个线程在变量被写入的那一刻读取它,这可能会导致意外的结果,如果不是臭名昭著的未定义行为的话。 ***.com/a/25320238/6028746 @rcgldr 标准在哪里指定了“兼容类型”是什么,如果它们是兼容类型,它在哪里说 volatile 变量是原子的? 您至少需要 C11 才能获得可移植的方法。在标准(以草稿形式提供)中,您需要查看 ,并且可能还需要查看 5.1.2.3 Program Execution 中的内存一致性模型规范。哦,而且 volatile 不起作用。 【参考方案1】:

对于可移植的方法,您至少需要 C11。在标准 (以草稿形式提供),您需要查看 和 也可能在 5.1.2.3 的内存一致性模型规范中 程序执行。哦,易失性不起作用。 – 忍者

对;要对此进行扩展,可以编写例如:

#include <stdatomic.h>
…
    // thread 1
    atomic_store(&variable, value);
…
    // thread 2
    value = atomic_load(&variable);
…

(您可能还对UNIX Portable Atomic Operations 或<stdatomic.h> in GCC 4.8? 感兴趣)

【讨论】:

以上是关于c - 一个线程写入一个变量,另一个线程读取它的主要内容,如果未能解决你的问题,请参考以下文章

从一个线程读取变量并从另一个线程写入的正确方法?

在一个线程中修改成员变量并在另一个线程中读取

C ++如果一个线程写入一旦完成就会切换一个布尔值,那么在另一个线程的循环中读取该布尔值是不是安全?

C# - 将数据写入流 + 使用另一个流读取数据

C# 线程安全:在一个线程中读取变量同时在另一个线程中更新该变量会导致意外行为吗?

允许多个线程一次读取给定条件变量,但只有一个线程写入