2012-03-31 1 views
3

Что такое пример программы, которая имеет ошибку из-за того, что _ReadBarrier() не вызывается?Что такое пример программы, в которой ошибка, вызванная _ReadBarrier(), не вызвана?

В статье MSDN по _ReadBarrier(): http://msdn.microsoft.com/en-us/library/z055s48f(v=vs.120).aspx

+0

Возможно, вы найдете решение, найдя программу, которая использует '_ReadBarrier()', а затем удаляет ее ... –

+2

Сначала вам нужно получить машину с ядром Itanium. Трудно найти, из-за cr * p, как это. –

+0

@HansPassant, где написано, что только Itaniums могут испытывать ошибки из-за того, что не вызывали _ReadBarrier()? –

ответ

1

Этот пост, мой любимый блоггер, расскажет все, что вы когда-либо было о читать и писать барьеры: Barrier (и в очень юмористические и язык-в щеки, тоже)

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


КСТАТИ (ссылаться на комментарий Ганса) Это не значит, что только Itaniums ошибки синхронизации опыта, это то, что Itaniums разработаны в полной мере воспользоваться полным переназначением и распараллеливания, в предположении, что DEV/компилятор знает, что он/она/делает и будет использовать барьеры во всех необходимых местах. Другие платформы, такие как x86, гарантируют, что некоторые инструкции будут выполнены в порядке, в то время как другие платформы, такие как x86_64, не гарантируют заказы других инструкций, но на практике и в основном по соображениям здравомыслия и совместимости выполняют их (обычно) в -order (см. связанное сообщение в блоге).

+0

Mahmoud: Интересная статья, но можете ли вы придумать пример программы, в которой есть ошибка из-за того, что _ReadBarrier() не вызывается? –

+0

Образец кода под заголовком «Даже кухня» на этой странице. –

+1

Образец кода под заголовком «Даже кухня» вызывает барьер(), а не _ReadBarrier(). –