Статьи

(Почти) все, что вы читаете о потоках, неправильно!

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

Так что не удивительно, что тема возродилась и о ней стало больше разговоров. А что за нить, если не упоминать о подводных камнях и проблемах ? Рассмотрим следующий вопрос:

int x = 1;
int y = 0;

if (y == 0)
{
   // Can x be anything but 1 at this point?
}

В этом типе вопросов нет недостатка. И нет недостатка в ответах тоже!

Единственный правильный ответ на поставленный выше вопрос: это зависит от языка!

Что делает ключевое слово volatile? Тот же ответ.

Мой код страдает от проблемы ABA ? Тот же ответ (но тот более сложный )

Подобный вопрос, тот же ответ.

// Thread 1
x = 1;
y = 0;

// Thread 2
int a = x;
int b = y; // if b == 0, is a == 1?

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

Зачем? Потому что модели памяти разные. C ++ имеет очень отличную модель памяти, чем .Net, чем Java . (Было бы совершенно неправильно сказать, что C / C ++ не определяет никакие модели когерентности памяти как таковые.) В свою очередь, каждая из них, вероятно, имеет свою модель памяти, отличную от других языков. И говорить о многопоточности, не зная модель памяти, все равно что предполагать, что вы можете двигаться с одинаковой скоростью на всех дорогах. Ну, некоторые даже не проложены, но некоторые имеют минимальную скорость.

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

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

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

От http://blog.ashodnakashian.com/2011/07/almost-everything-you-read-about-threading-is-wrong/