Запись uint32 в uint64 не является атомарной. Зачем? - PullRequest
1 голос
/ 07 мая 2019

In Трудно ли выполнять параллельное программирование, и, если да, что вы можете с этим сделать на стр. 410 написано:

Быстрый тест 5.17:

Почему в листинге 5.4 inc_count() не нужно использовать атомарные инструкции?

Ответ:
(..) атомарные инструкции будут необходимы в случаях, когда переменные счетчика для каждого потока были меньше, чем глобальный глобальный (..)

Упрощенно, это предложение относится к следующему примеру:

uint64 global_count = 0;

void f(){
    uint32 sum = sum_of_smaller_thread_locals(); # sum is a variable 
    WRITE_ONCE(global_count, sum);
}

Я не могу понять, зачем нам нужны атомарные инструкции в этом случае?

1 Ответ

2 голосов
/ 07 мая 2019

Как указывает Питер Кордес, атомарные инструкции потребуются для приращений для каждого потока. Причина указана в тексте, но излишнее «однако» слегка затуманивает его:

Тем не менее, атомарные инструкции будут необходимы в случаях, когда переменные счетчика на поток были меньше, чем глобальные global_ сосчитать. Однако, обратите внимание, что в 32-битной системе счетчик на поток переменные могут быть ограничены 32 битами, чтобы их суммировать точно, но с 64-битной переменной global_count, чтобы избежать переполнения. В этом случае необходимо обнулить переменные счетчика на поток периодически во избежание переполнения. Чрезвычайно важно обратите внимание, что это обнуление не может быть отложено слишком долго или переполнение меньшие переменные для потока приведут. Поэтому этот подход налагает требования в реальном времени на базовую систему, и в свою очередь должны использоваться с особой осторожностью.

Напротив, если все переменные тот же размер, переполнение любой переменной безвредно, потому что возможный сумма будет по модулю размера слова.

Если основной поток очищает счетчики для каждого потока, он должен сделать это через атомарный обмен, чтобы избежать возможной потери данных. Если приращения для каждого потока выполняют очистку, во избежание потери данных им потребуется другой (вероятно, более сложный) тип блокировки.

...