Допустим есть такой код:
flag = 0;
while(!flag) {
/* ... тут много кода, у компилятора нет шансов его оттрассировать до конца ... */
}
Где-то в другом треде однажды ставится flag = 1 (вокруг этой операции тоже много кода). И всё это без межтредовой синхронизации (точнее, где-то в другом коде она может быть, но сама по себе и с переменной flag явно не связана).
У меня есть подозрение, что формально это некоторые могут посчитать UB, так ли это? Если да, то можете ли привести пример, с любыми дикими опциями оптимизатора и любым плеванием на здравый смысл разработчиков компилятора, но в рамках реальности, при каких условиях подобная логика может сломаться?
Ожидаемое поведение: спустя небольшое время на обработку процового конвеера с операцией записи единицы в flag + выгрузку всех процовых writeback кешей, если они есть + ожидание завершения тела цикла, цикл прекратится.
Поскольку возникло непонимание вопроса, уточняю:
static int flag;
static void * threadfunc(void *p) {
flag = 0;
while(!flag) {
/* много кода */
}
return NULL;
}
extern void set_flag_1(void) {
flag = 1;
}