Оказывается, тут с С++ недавно вышла очень нетривиальная ситуация касательно реализации на процессоре x86.
Александр Терехов предложил совершенно очевидную реализацию тотально упорядоченных атомарных операций:
http://www.decadent.org.uk/pipermail/cpp-threads/2008-December/001933.htmlLoad Seq_Cst: LOCK XADD(0)
Store Seq Cst: LOCK XCHG
а приняли в работу совсем другую, совершенно неочевидную:
http://www.cl.cam.ac.uk/~pes20/cpp/cpp0xmappings.htmlLoad Seq_Cst: MOV (from memory)
Store Seq Cst: (LOCK) XCHG
на основании, кажется, единственно вот этой практически математической статьи:
http://www.cl.cam.ac.uk/~pes20/cpp/popl085ap-sewell.pdf. Ничего больше мне пока раскопать в этом казусе не удалось.
Понятно, что сама по себе команда MOV никакую тотальную упорядоченность не обеспечивает, но в сочетании с XCHG - якобы достигается ровно тот же эффект. И, конечно же, с колоссальной экономией на более частых операциях чтения. Не знаю даже что и сказать, статью пока читал по верхам, вглубь ниасилил.
Между прочим, я лет 10 назад обо всём этом в ЖЖ писал:
http://yigal-s.livejournal.com/2120.html - разумеется, о первом варианте, а не о втором.