使用函数指针和放大器时是否需要readlock?静态变量?

时间:2013-01-29 23:21:59

标签: c linux concurrency mutex

我们是否需要一个读锁来读取除变量小于memalign之外的整数以及某些缓存情况?

2 个答案:

答案 0 :(得分:1)

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

lock xlock;
update x;
unlock xlock;

并且另一个线程通过函数指针同时调用f1(),第二个线程中对f1()的访问将不受锁的保护。因此,它可能会看到x的部分更新,或者看到更新错误地与其他更新有关。

函数指针重要的原因是如果永远不会采用f1()的地址,那么分析器可以确切地确定函数的调用位置。当地址被采用时,它必须假设最坏的情况。

答案 1 :(得分:1)

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

  

如果一个函数已经获取了它的地址,那么我们假设我们这样做了   不知道对该功能进行的每次通话的背景

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

合理地说,你可能不会通过返回x来击中任何可怕的东西。但这是一个概率,使用lint的重点是减少代码如何与意外输入一起工作的不确定性。