Многопоточность и выполнение не по порядку - PullRequest
3 голосов
/ 21 декабря 2011

Предположим, что у нас есть многопоточная программа C (pthreads), и (несинхронизированные) обращения к разделяемым переменным отдельных потоков не переупорядочиваются компилятором.Соответствует ли процессор x86 порядку обращений к общей переменной (в пределах одного потока) или возможно, что он переупорядочивает некоторые обращения к памяти?

Ответы [ 2 ]

0 голосов
/ 22 декабря 2011

Несинхронизированные обращения к разделяемым переменным опасны, и одной из причин этого является нарушение порядка.
X86 сохраняет записи в порядке (в потоке), но не читает.

Это может привести к неприятностям, если вы предполагаете, что заказ остается. Например:
Поток A записывает в x, а затем в y. Предполагая, что компилятор не переупорядочивает его, процессор не будет переупорядочивать его (x86 не будет, другие могут).
поток B читает у, а затем х. Вы можете подумать, что если оно получило новое значение y, то наверняка вы получите и новое значение x.
Не так. Процессор может изменить порядок чтения потока B, так что y будет фактически прочитано раньше.

РЕДАКТИРОВАТЬ : как указал «Человек с односторонним движением», в этом случае x86 (но не все процессоры!) Гарантирует порядок.
Я цитирую руководство разработчика программного обеспечения Intel:

Записи одного процессора наблюдаются всеми в одном и том же порядке процессоры.

Это не относится к операциям записи несколькими процессорами - они могут выглядеть по-разному для разных процессоров.

Однако я настоятельно рекомендую не полагаться на него, а использовать вместо него правильную синхронизацию.
Примитивы синхронизации реализованы с атомарными операциями и / или барьерами, которые обеспечивают вам безопасность.

0 голосов
/ 21 декабря 2011

Возможны некоторые переупорядочения из-за наличия буфера хранилища. Смотрите, например https://www.cl.cam.ac.uk/~pes20/weakmemory/cacm.pdf

Однако переупорядочения видны только с несколькими потоками, в пределах одного потока все обращения из этого потока, по-видимому, происходят по порядку.

...