я придумал хорошее использование статического ключевого слова внутри функции, чтобы быть что-то вроде этого:Как инициализировать статическую переменную в многопоточном контексте?
void threadSafeWrite(int *array, int writeIndex, int writeData){
static void *threadLock = Lock_create(); //in my code locks are void* to be cross-platform compatable
Lock_aquire(threadLock);
array[writeIndex] = writeData;
Lock_release(threadLock);
}
Короче говоря, кажется, как хороший способ, чтобы сделать критическую секцию. Мой вопрос заключается в том, как инициализировать threadLock в потоковом режиме? Проблема с примером, я боюсь, заключается в том, что блокировка будет распределяться несколько раз, и каждый поток будет использовать другую блокировку. Есть какие нибудь идеи как это починить? Похоже на проблему с курицей и яйцом. Я хочу решение (или решения), которое работает как с потоками pthreads, так и с окнами.
EDIT: причина, по которой я хочу эту функциональность, заключается в том, что она обеспечивает неинтрузивный способ проверить, есть ли разница при выполнении части кода однопоточной или многопоточной (предназначенной для целей отладки).
Read_memory_barrier не требуется, поскольку это подразумевается блокировкой. Однако это двукратно проверенная идиома блокировки, которая недопустима в большинстве моделей памяти. Второй поток может видеть 'init_flag = 1', но устаревшее значение' data' или вещи, на которые он указывает. – jilles
@jilles Я не знаю о «большинстве моделей памяти». –
Вы можете сделать это с помощью CAS и избежать блокировки, если вы не возражаете, чтобы несколько раз называть init_data и быть готовым бросить кого-то в этом случае. –