函数指针是否安全?

时间:2016-10-19 09:02:01

标签: c multithreading thread-safety

(这跟随Are static inline functions thread safe?

场景:我编写了一大段代码,运行在2个并行线程上,这些线程在代码方面是相同的,只是处理不同的数据。我看到了非确定性的结果。如果我禁用2个线程中的一个,结果将变为确定性。在这段代码中我使用了一些函数指针,我想了解它们是否可能导致我的问题。

函数指针在C中是否是线程安全的?换句话说,如果内部没有静态变量,但只有一些局部变量和输入参数,那么从2个线程同时调用会导致不可预测的行为吗?

示例代码:

void foo(int param1, int* out);
void bar(int param1, int* out);

typedef void (*fooBarFuncP_t)(int, int*);

static inline fooBarFuncP_t getFooBar(int selection) {
    switch (selection) {
        case 0:
            return &foo;
        case 1:
        default:
            return &bar;
    }
}

void test(int selection, int x, int* y) {
    (*getFooBar(selection))(x,y);
}

其中:

  • 在实施过程中,foobar只有本地非静态变量
  • y由测试调用者
  • 分别为2个线程分配

这是线程安全的吗?如果没有,这个问题有什么解决方案?

2 个答案:

答案 0 :(得分:2)

调用/使用函数指针与使用关于线程安全的函数没有什么不同。 在该示例中,您发布了没有线程安全问题(在您声明的条件下)。

假设您仍然遇到与线程安全相关的问题,可以提出一些建议:

  • 检查代码中是否存在任何数据竞争。

  • 通过标题,库函数,第三方函数等检查是否有任何静态变量(我知道你已经说过没有但是你可能错过了一些)。

  • Helgrind下运行您的代码。

答案 1 :(得分:0)

在线程安全方面,函数指针和常规变量之间没有区别。如果变量由多个线程共享,并且至少在线程写入变量时,则需要保护它。

调用函数的地方与该函数的线程安全性无关。唯一重要的是执行该函数的线程。如果多个线程调用相同的函数,无论它们如何执行,那么该函数需要是线程安全的。