Re[4]: multithreading : visibility control
От: uzhas Ниоткуда  
Дата: 31.05.13 07:08
Оценка:
Здравствуйте, okman, Вы писали:

ну вот первый квалифицированный ответ

O>Правила все те же — compiler reordering, hardware reordering.

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

O>Если этого не сделать, вызов spawnThread может быть перемещен, например, в начало функции, до заполнения globalMap данными.

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

O>По поводу второго можно не беспокоиться, так как публикация данных для других потоков -

O>это так или иначе установка какого-нибудь флага, то есть, запись в память. В результате
O>получается комбинация store-store, которая эффектам hardware ordering не подвержена.
тут я не понял о каком флаге идет речь и что такое публикация

O>Еще можно заподозрить компилятор в том, что однажды он проявит излишнюю сообразительность и

O>реализует globalMap через регистры, из-за чего другие потоки не увидят данных.
и какие подсказки надо использовать, чтобы словарь все же расшарился между потоками?

O>Все написанное справедливо для IA-32 и AMD64, на других процессорных архитектурах с

O>более "расслабленной" моделью памяти может потребоваться установка хардварного барьера.

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