【问题标题】:Do we need readlock while using function pointer & static variable?使用函数指针和静态变量时我们需要读锁吗?
【发布时间】:2013-01-29 23:21:59
【问题描述】:

如果变量小于 memalign 并且在某些缓存情况下,我们是否需要读取锁来读取整数?

【问题讨论】:

  • 我不明白这个。你的问题到底是什么?另外,我没有看到上面的变量是static。此外,如果您需要通过不同线程访问的全局变量,请声明它volatile
  • 问题到底是什么?
  • @noMAD:变量xy 具有静态存储持续时间。而volatile 对于安全并发访问来说既非必要也不充分。
  • 我同意,我认为我们应该假设 x, y 是静态变量(无论如何它会有所不同吗?)我认为我们应该假设使用 pthread_create 调用 t() ...顺便说一句,它是引用(复制粘贴)pc-lint 文档中的一章,所以我也试图弄清楚函数指针(谁的函数只是读取没有写入)和静态变量以及访问这些函数/变量的多个线程之间是否存在任何关系。

标签: c linux concurrency mutex


【解决方案1】:

分析器假定由于f1() 的地址已被占用,因此可以从任何上下文通过该函数指针调用它。例如,如果您有一个线程正在更新x

lock xlock;
update x;
unlock xlock;

另一个线程同时通过函数指针调用f1(),第二个线程中对f1()的访问将不受锁保护。因此,它可能会看到 x 的部分更新,或者看到更新相对于其他更新的顺序不正确。

函数指针之所以重要,是因为如果f1()的地址从未被取走,那么分析器就可以准确地确定函数是从哪里调用的。当地址被占用时,它必须假设最坏的情况。

【讨论】:

  • +1 "partial update of x" - 如果 memalignment 小于 sizeof(int) 或缓存,你是指整数读取不是原子的吗?
  • @purpletech:原子读取的要求是特定于平台的 - 无论如何分析器不知道单个 int 是否需要自己保持一致,或者它的一部分是否需要需要内部一致的更大数据结构。请注意,pthreads 内存模型不能保证您甚至可以将正确对齐的int 作为原子操作访问 - 它需要在竞速读取和写入之间进行同步原语。
【解决方案2】:

从你引用的文字(强调我的):

如果一个函数的地址被占用,那么 我们假设我们这样做了 不知道对该函数的每次调用的上下文

由于 lint 无法确定可以调用 f1 的每个上下文,它假定可以在任何上下文中调用它,包括访问 x 会导致某些数据竞争的上下文。

合理地,您可能不会通过返回 x 遇到任何可怕的事情。但这是一个概率,使用 lint 的全部意义在于减少代码在意外输入下如何运行的不确定性。

【讨论】:

    猜你喜欢
    • 2023-03-24
    • 2023-03-07
    • 2021-01-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多