2016-10-19 2 views
1

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 개 스레드에 대해 별도로 할당

    구현, foobar 가지고있어서
    • 로컬 비 정적 변수
    • 시험의 범위

    이 스레드로부터 안전한가요? 그렇지 않다면이 문제에 대한 해결책은 무엇입니까?

  • +0

    데이터 경쟁이 없습니다. – 2501

    +0

    그래서'foo'와'bar' 사이에는 상호 작용이 없습니다. 맞습니까? 첫눈에 나는 어떤 문제도 여기에서 보지 않는다. –

    +0

    @MichaelWalz 좋은 지적. 'foo'와'bar'는 버퍼를 공유합니다 (입력 매개 변수의 일부입니다). 그러나 버퍼는 2 개의 스레드에 대해 개별적으로 할당되며'foo'와'bar'는 같은 스레드 내에서 동시에 호출되지 않습니다 *. (나는 이중 검사를합니다) – Antonio

    답변

    1

    함수 포인터를 호출/사용하는 것은 스레드 안전과 관련하여 함수를 사용하는 것과 다르지 않습니다. 예를 들어, 귀하가 명시한 조건 하에서 스레드 안전성 문제가 게시되지 않았습니다. 코드에서 데이터 경쟁있다

    • 확인하는 경우 : 당신은 여전히 ​​스레드 안전에 관련된 문제, 몇 가지 제안이 가정

      .

    • 헤더, 라이브러리 함수, 타사 기능 등을 통해 관련된 정적 변수가 있는지 확인하십시오. (아무 것도 말하지 않았지만 여전히 누락 된 것이 있습니다.)

    • 코드를 Helgrind에서 실행하십시오.

    0

    스레드 안전성 측면에서 함수 포인터와 일반 변수 사이에는 차이가 없습니다. 변수가 여러 스레드에 의해 공유되고 적어도 스레드에 대한 변수 쓰기는 보호해야합니다.

    함수가 호출 된 곳은 해당 함수의 스레드 안전성과 관련이 없습니다. 중요한 것은 함수를 실행하는 스레드뿐입니다. 여러 스레드가 같은 함수를 호출하는 경우에도 관계없이 함수가 스레드 안전성을 유지해야합니다.

    +0

    내 예제에 따르면 함수가 스레드로부터 안전하지 않습니까? (아래의 노트도 참조하십시오.) – Antonio

    +0

    @Antonio "test"함수는 공유 리소스를 사용하지 않으므로 안전하지 않은 이유가 없습니다. 이 예제가 스레드로부터 안전한지 아닌지는 두 개의 호출 된 함수가 스레드로부터 안전한지 여부에 달려 있습니다. – Lundin

    관련 문제