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);
}
:
y
호출자에 의해 2 개 스레드에 대해 별도로 할당 구현, foo
및 bar
가지고있어서
- 로컬 비 정적 변수 시험의 범위
이 스레드로부터 안전한가요? 그렇지 않다면이 문제에 대한 해결책은 무엇입니까?
데이터 경쟁이 없습니다. – 2501
그래서'foo'와'bar' 사이에는 상호 작용이 없습니다. 맞습니까? 첫눈에 나는 어떤 문제도 여기에서 보지 않는다. –
@MichaelWalz 좋은 지적. 'foo'와'bar'는 버퍼를 공유합니다 (입력 매개 변수의 일부입니다). 그러나 버퍼는 2 개의 스레드에 대해 개별적으로 할당되며'foo'와'bar'는 같은 스레드 내에서 동시에 호출되지 않습니다 *. (나는 이중 검사를합니다) – Antonio