2014-02-11 4 views
8

Я могу думать о причинах, когда это не имеет значения, и 1 ситуация, когда вы НЕ хотите использовать их, когда вы хотите протестировать дизайн поведения с неатомными операциями.Когда НЕ использовать атомные операции?

Каковы другие причины? В частности, я работаю над проектом, который имеет некоторые редкие условия гонки, потому что тест не использует атомные приращения. Мне интересно, почему я бы не всегда использовал атомные приращения, когда функция для него уже существует?

Спасибо!

+0

Позвольте мне рассказать вам о вас. Если вы пишете свою программу, чтобы рабочие генерировались как новые * процессы *, а не новые * потоки *, вам никогда не придется беспокоиться об атомных обновлениях в общую память, потому что процессы не обмениваются памятью. Поэтому вместо того, чтобы спрашивать «почему бы не всегда использовать атомные операции?» не было бы разумным вместо этого спросить **, почему бы не всегда использовать процессы вместо потоков **? –

+0

Интересный момент, я полагаю, проблема та же, что и для того, чтобы не использовать атомику, ресурсы, такие как память/скорость, ограничены. –

ответ

6

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

+1

Кроме того, конечно ... Просто используя атомы повсюду, на самом деле ничего не делает для улучшения безопасности потока (и может привести к взаимоблокировкам, если вы пропустите правильный анализ из-за этого). –

+0

@JamesKanze, атомы не обязательно основаны на замках – Leeor

+0

@Leeor Хотя это правда, им также не гарантируется _not_ использование блокировки, и есть другие способы блокировки (или поместить все активные потоки в busyloops, что не является более полезно). Правильность программы - это *** глобальное свойство ***. –

1

Атомные операции потенциально и, вероятно, дороже, чем их неатомный эквивалент. В случаях, когда синхронизация между потоками не нужна, например, обновление нерасширенного локального, атомизация добавляет лишние накладные расходы, и их следует избегать.

Смежные вопросы