gpt4 book ai didi

c - 当只有一个线程写入共享变量时,我需要锁吗?

转载 作者:太空狗 更新时间:2023-10-29 16:51:12 25 4
gpt4 key购买 nike

我有 2 个线程和一个共享的 float 全局线程。一个线程只写入变量而另一个线程只读取它,我需要锁定对该变量的访问吗?换句话说:

volatile float x;

void reader_thread() {
while (1) {
// Grab mutex here?
float local_x = x;
// Release mutex?
do_stuff_with_value(local_x);
}
}

void writer_thread() {
while (1) {
float local_x = get_new_value_from_somewhere();
// Grab mutex here?
x = local_x;
// Release mutex?
}
}

我主要担心的是 float 的加载或存储不是原子的,这样 reader_thread 中的 local_x 最终会得到一个伪造的, 部分更新值。

  1. 这是一个合理的担忧吗?
  2. 有没有其他方法可以在没有互斥体的情况下保证原子性?
  3. 使用 sig_atomic_t 作为共享变量是否可行,假设它有足够的位满足我的目的?

有问题的语言是使用 pthreads 的 C。

最佳答案

不同的架构有不同的规则,但一般来说,内存加载和存储对齐的、int 大小的对象是原子的。越来越小可能会有问题。所以如果 sizeof(float) == sizeof(int) 你可能是安全的,但我仍然不会在可移植程序中依赖它。

此外,volatile 的行为并不是特别明确...规范将其用作防止优化访问内存映射设备 I/O 的方法,但什么也没说关于它在任何其他内存访问上的行为。

简而言之,即使加载和存储在 float x 上是原子的,我也会使用显式内存屏障(尽管因平台和编译器而异)而不是依赖于 volatile。如果不能保证加载和存储是原子的,您将必须使用锁,这确实意味着内存障碍。

关于c - 当只有一个线程写入共享变量时,我需要锁吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/859690/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com