Представьте себе программу с двумя потоками. Они работают следующий код (CAS относится к Compare and Swap):Могут ли конкурирующие атомные операции голодать друг с другом?
// Visible to both threads
static int test;
// Run by thread A
void foo()
{
// Check if value is 'test' and swap in 0xdeadbeef
while(!CAS(&test, test, 0xdeadbeef)) {}
}
// Run by thread B
void bar()
{
while(1) {
// Perpetually atomically write rand() into the test variable
atomic_write(&test, rand());
}
}
Возможно ли поток B, чтобы постоянно вызывать CAS нитяных на неудачу таким образом, что 0xDEADBEEF никогда не пишется на «тест»? Или естественный джиттер планирования означает, что на практике это никогда не происходит? Что делать, если какая-то работа была выполнена внутри цикла while A?
Зачем это выполнять только дважды? Если он оптимизирует выбор теста, это не значит, что он мог бы зацикливаться навсегда *? Сравнение и своп всегда будут терпеть неудачу, потому что сравнение будет постоянно ошибочным, если только вам не повезло, а rand() возвращает значение, которое было выполнено до того, как поток A ввел цикл, и поток A запускается в нужное время. –
Также, когда вы говорите невероятно маловероятно, вы имеете в виду маловероятное, что вы не будете против использования этого кода в производственном программном обеспечении? Было бы интересно попытаться вычислить упрощенную вероятность. –
Когда я лично говорю невероятно маловероятно, когда речь идет о проблеме с потоками, я имею в виду, что я хочу, чтобы она исправлена, так что этого действительно не происходит. Я слишком много «не собираюсь» взорвать меня. –