Как уже упоминалось, в языке C нет ничего, что гарантировало бы это, и это зависит от вашей платформы.
На большинстве современных настольных платформ чтение / запись в выровненном месте размером с слово будет атомарным. Но это действительно не решает вашу проблему из-за переупорядочения чтения и записи процессором и компилятором.
Например, следующий код не работает:
Тема A:
DoWork();
workDone = 1;
Резьба B:
while(workDone != 0);
ReceiveResultsOfWork();
Хотя запись в workDone
является атомарной, во многих системах процессор не гарантирует, что запись в workDone
будет видима для других процессоров до того, как будут выполнены записи, сделанные через DoWork()
. Компилятор также может свободно переупорядочить запись в workDone
до перед вызовом DoWork()
. В обоих случаях ReceiveResultsOfWork()
может начать работать с неполными данными.
В зависимости от вашей платформы может потребоваться установка ограждений памяти и т. Д., Чтобы обеспечить правильное упорядочение. Это может быть очень сложно, чтобы получить право.
Или просто используйте замки. Гораздо проще, гораздо проще проверить, как правильно, и в большинстве случаев более чем достаточно.