Просматривая на Хабре поток «Параллельное программирование», не верится, что на дворе «образованный век». Все против этого. Особенно статьи типа «Три способа менять один объект из нескольких потоков. Больше нет».

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

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

Упомянутая статья - «гром среди ясного неба»! Ни кто до этого не знал, что делать с одним объектом, а тут вдруг - прозрение! Буквально на раз или, что точнее, на три. Есть ровно три варианта, после чего «объекту» уже не скрыться от «потоков», у которых до него дотянуться руки. Ровно три! Меньше – да, «больше нет»!

Люди, вы пытаетесь вникнуть в смысл прочитанного?!   Спросите, где он? А вот это уже другой вопрос. На, который, к счастью, есть ответ… В научном познании мира.

Однако, процитирую отрывок из краеугольной, судя по реакции «народа»,  статьи:


Правильный вопрос

Вот он:

Что происходит, когда два потока одновременно хотят изменить один объект?

Не «как устроен mutex». Не «чем CAS лучше lock». А именно: что случится при конфликте?

Ответов ровно три:

  1. Один победит, другой переделает работу (First Win + Retry) - конфликт обнаруживается и разрешается

  2. Один подождёт, пока другой закончит (Single Writer) - конфликта нет

  3. Последний затрёт первого (Last Win) - конфликт игнорируется, результат часто случайный.

Всё. Это полный список. Других вариантов не существует.


Ни тебе определений, ни пояснений, а сразу - бац! – по голове! Что скрывается за термином «поток»? Кто такой, потерпевший  - «объект»? Но кого это интересует, когда «истина» проецируется на «народ»?!   Верующему всегда и все ясно (видимо потому у статьи и указан тег – «Простой»?).

Мы же попробуем разобраться. С термином «поток», кажется, просто. Это явно не поток паломников и точно не поток сознания. Даже «свыше»  понятно, что это поток команд на любом языке программирования. Он может быть простым или сложным, но, без сомнения, не старославянским языком. Кстати, а почему речь идет только о двух потоках?

С «объектом» другая ситуация. «Свыше», похоже, с этим понятием не определились. Отдельная ли это переменная, структура или объект в смысле ООП, простой ли, сложный ли компонент базы данных – можно гадать сколь угодно. В разной ситуации это будет по-разному. Вот, что явится, за то и молись. Остается также вера в чудо, но не исключаются также «пот, боль и кровь».

Дальше предпринимается попытка хоть что-то объяснить, но понимания от этого не прибавляется. Цитирую:


*Что такое "работа", "конфликт" и почему "переделать"?

Потому что бизнес логика / валидатор дан на стейт. А стейт изменён в промежутке между:
1 чтением,
2 вычислением нового состояния,
3 валидацией,
4 записью нового состояния.

Изменен вот почему:
State_new = f(State_old, command)
Если один поток поменял состояние, то работа второго теперь зависит от нового состояния, надо всё переделать.

Оптимист начнет работу, надеясь что его не опередят.
Пессимист подождёт


Из текста понятно только то, что, веруя в чудеса, некий  «оптимист начнет», а его антипод - «пессимист подождет». Последний, не буду скрывать,  более симпатичен.

Но почему только «бизнес-логика»? Или для другой логики по логике нужна отдельная логика?  А что означает - «дан на стейт»? Это, простите, по-каковски? По-старославянски? – нет.  Не напоминает и современный русский. По-английски? – похоже, но весьма отдаленно. Кто «дан», что «дан», куда «дан»? Кто такой «стейт» и что с ним произошло, когда его безвозвратно изменили при «записи нового состояния»? А откуда появилось «состояние»? Негасимый огонь принесли?...

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

Просто потому, что, друг мой, Маугли, «мы другой крови»…

PS

А про голову-то, оказывается, я угадал. К авторскому: «А ещё можно шахматной доской по голове и разбить единый стейт на шарды, уходя в eventual consistentcy», как говорится, не убавить не прибавить. Тут не знаешь – смеяться или жалеть. Но этой фразой можно описать всю жизнь современного раненного на голову «многопоточника», начиная с … одного объекта и двух потоков :)

А если серьезно…

О научном познании… Здесь тоже не все так очевидно и просто.

Достаточно давно мне попалось первое издание книги - Т. Кормен, Ч Лайзерсон, З. Риверст «Алгоритмы: построение и анализ».  Это, если что, начало 90-х годов. Первым делом я проштудировал «Дополнительные главы» – сортирующие сети, арифметические схемы и алгоритмы параллельных вычислений (гл. 28-30). Ликованию не было границ, т.к. шла речь о том, что так увлекало – о параллельных вычислениях. Не со всем был согласен, но возникло чувство сопричастности на серьезном теоретическом уровне.

В книге параллелизм начинался с PRAM – параллельной машины с произвольным доступом. Здесь узнаешь, что «существует несколько подходов к использованию общей памяти». И пусть сокращения типа EREW, CREW, ERCW и CRCW были непривычны, но  в понимании затруднений не вызывали. Всего ближе был CREW (concurrent-read, exclusive-write). До сих пор я признаю только этот подход.

И вот по прошествии стольких лет мы так и не знаем, что делать с одним объектом и всего-то двумя потоками? Мы вернулись в 1991 год? Или жизнь просквозила мимо?!

Но если вы захотите вновь ощутить «мокрые пеленки», то  найдите первое издание «Алгоритмов». Почему 1-е? Дело в том, что во 2-м ее издание, по неведомым причинам исчезла глава «Арифметические схемы» и, что совсем уж добило,  глава «Алгоритмы параллельных вычислений». Остались, правда,  «Сортирующие сети». Разочарование было убийственным. А авторов сработал какой-то «переключатель» и, может, это следствие подключения к коллективу К. Штайна?

На этом «квест» не завершился. Из 3-го издания ушли и «Сортирующие сети» (К.Штайн, замечу, остался), но зато были добавлены «Многопоточные алгоритмы». Такая беспринципность  столь уважаемых теоретиков расстроила окончательно, а потому последующие издания, если они даже были, меня уже почти не интересовали.

Это грустно, когда теория идет на жестком поводке. Понятно, что в тренде многопоточность, понятно, что она принесет деньги, но…  нельзя же так, братцы-теоретики?! Вы, возможно, и заработали, но больше потеряли. Пусть вы включили многопоточность (есть там, кстати, даже нечто интересное), но разве не любопытно узнать, как она решала бы проблемы сортирующих сетей, арифметических схем? А так все свелось к перемножению матриц. Или думаете, что параллелизм сводится к теме матриц?

С тех пор я почти не открываю «Алгоритмы…». Другие книги, возможно, не такие толстые, может, не такие и подробные, может, …  Да просто, может, мои интересы ушли в сторону от теории алгоритмов. Хотя иногда я все же возвращаюсь к ним. Как недавно это случилось с алгоритмами параллельных сортировок на базе философов.

Кстати, у философов есть доступ к одному объекту - вилке со стороны двух потоков – хозяина вилки и его соседа. Совпадение?

Да, нет. Как ни крути, а «все течет и ничто не остается на месте». И параллельное программирование здесь не исключение. На какое-то время его можно даже исключить из рассмотрения, сведя при этом его теорию к многопоточности, но навсегда – уже никогда.

Комментарии (1)


  1. kmatveev
    11.01.2026 10:49

    Вся статья - сплошное брюзжание. Зима, наверное, влияет.

    Я внимательно читал статью, на которую автор бухтит. Статья норм.