Использование блокировок для синхронизации потоков и поддержания когерентности кэша - PullRequest
0 голосов
/ 01 июля 2011

Если бы я использовал какой-то алгоритм, который использует операции InterlockCompareExchange над переменной в C ++, который определяет, записывается ли набор данных определенным потоком (путем создания моей собственной маленькой блокировки), как я могу гарантировать, чтосблокированная операция, которая обновила значение, сразу же просматривается другим потоком, если данные хранятся, например, в кеше 2 уровня на i7.

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

Надеюсь, мой вопрос не слишком расплывчатый.Я постараюсь ответить на любые комментарии, если я был.У меня нет исходного кода для публикации с этим вопросом, так как у меня нет особых проблем, но я хотел бы знать для дальнейшего использования, могут ли быть какие-либо проблемы с этим, особенно с c ++ 0x, имеющим блокировки как частьсвоей стандартной библиотеки.

Спасибо.

1 Ответ

1 голос
/ 01 июля 2011

Компилятор не может переупорядочивать загрузки или сохранения во взаимосвязанном вызове функции, и реализация будет включать все машинные инструкции, необходимые для проверки того, что ядро ​​ЦП не будет.

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

...