(これは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