(Это следует Are static inline functions thread safe?)Являются ли функции указателями потоками безопасными?
Сценарий: Я написал большой кусок кода, работает на 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);
}
Где:
- В их реализации,
foo
иbar
имеют только локальные, не являющиеся статические переменные y
выделяется отдельно для 2-х потоков, вызывающей от испытания
Является ли это потокобезопасным? Если нет, то какие решения существуют для этой проблемы?
Нет гонки данных здесь. – 2501
Таким образом, между 'foo' и' bar' нет взаимодействия, не так ли? На первый взгляд я здесь не вижу никаких проблем. –
@MichaelWalz Хорошая точка. 'foo' и' bar' используют некоторый буфер (это часть входных параметров). Но буферы распределяются отдельно для двух потоков, а 'foo' и' bar' не вызываются одновременно * в пределах одного потока *. (Я проверю дважды) – Antonio