Являются ли атомарность и неизменность двумя разными способами решения одних и тех же проблем в параллельном/параллельном программировании?

Правильно ли сказать, что можно спроектировать параллельную/параллельную систему с использованием атомарных операций ИЛИ с использованием неизменяемых типов? т.е. атомарные операции приводят к разработке системы с атомарно общим состоянием, а неизменяемые типы приводят к разработке системы, которая избегает совместного использования всех вместе? Являются ли эти два дизайна по существу заменой друг друга (решая одну и ту же основную проблему) или они решают разные проблемы (это означает, что для разработки полностью защищенной от параллелизма системы может потребоваться использовать как атомарные операции, так и неизменяемые типы)?


person Community    schedule 23.06.2017    source источник


Ответы (2)


Хотя обе концепции применимы к параллельным системам и обе гарантируют, что никакое промежуточное состояние никогда не будет прочитано, они очень разные и подходят для разных сценариев. Например, итерация неизменяемой структуры данных гарантирует правильную и «безопасную» итерацию, в то время как изменяемые структуры данных небезопасны для итерации, даже если изменяющие операции являются атомарными. С другой стороны, атомарная модификация общего/центрального хранилища данных гарантирует, что неверные данные никогда не будут прочитаны, в то время как неизменность не имеет значения, поскольку хранилище должно изменяться.

person Amit    schedule 23.06.2017
comment
Конечно, ConcurrentHashMap является одновременно изменчивым и итерируемым, поэтому я бы сказал, что некоторые структуры данных небезопасны для этого. - person Gray; 24.06.2017

Правильно ли сказать, что можно спроектировать параллельную/параллельную систему с использованием атомарных операций ИЛИ с использованием неизменяемых типов?

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

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

Они, конечно, не "заменители". Я бы сказал, что атомарность решает конкретную проблему с параллельными системами, но неизменность - это скорее "приятно иметь".

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

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

т.е. атомарные операции приводят к разработке системы с атомарно общим состоянием, а неизменяемые типы приводят к разработке системы, которая избегает совместного использования всех вместе?

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

Вы, безусловно, можете обмениваться данными между двумя потоками без использования атомарных ни неизменяемых типов. Поток № 1 обновляет State1, который используется всеми потоками, и поток № 2 обновляет State2, который также является общим.

person Gray    schedule 23.06.2017
comment
Как вы думаете, почему так много людей утверждают, что функциональные языки (с неизменяемыми типами, такие как Clojure и Haskell) лучше подходят для параллелизма, чем другие языки с хорошей поддержкой атомарных библиотек, такие как Java и C/C++? Разве хорошая атомарная библиотека не устранит все потенциальные проблемы в параллельном программировании? - person ; 24.06.2017
comment
Языковые аргументы носят религиозный характер @annoying_squid. Безусловно, неизменность делает вещи лучше и оптимальнее во многих параллельных ситуациях. Но это больше касается хороших шаблонов программирования, чем требований к параллелизму. - person Gray; 24.06.2017