Path: csiph.com!x330-a1.tempe.blueboxinc.net!usenet.pasdenom.info!aioe.org!eternal-september.org!feeder.eternal-september.org!.POSTED!not-for-mail From: Alexander Terekhov Newsgroups: comp.programming.threads Subject: Re: questions about memory_order_seq_cst fence Date: Mon, 27 Jun 2011 14:05:07 +0200 Organization: A noiseless patient Spider Lines: 51 Message-ID: <4E0871F3.10EC425A@web.de> References: <43eb372b-6517-4914-b647-860f1f7136ba@k15g2000pri.googlegroups.com> <87tybsm5kq.fsf@justsoftwaresolutions.co.uk> <35ec803e-2871-41ce-97ea-8b615b29050f@r33g2000prh.googlegroups.com> <87hb7r5z03.fsf@justsoftwaresolutions.co.uk> <87fwnafd9j.fsf@justsoftwaresolutions.co.uk> <4358686f-7bfb-480e-ae71-a8ce57566ab0@l14g2000pro.googlegroups.com> <871uyuasc0.fsf@justsoftwaresolutions.co.uk> <4DFCAB39.35CDACC8@web.de> <87sjr4r2ej.fsf@justsoftwaresolutions.co.uk> <4f622dc3-ad80-4bde-ba01-28e63ffa27d7@d19g2000prh.googlegroups.com> Reply-To: terekhov@web.de Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Transfer-Encoding: 7bit Injection-Info: mx04.eternal-september.org; posting-host="MCbSEzW5qwGLFMNXJh39IQ"; logging-data="15257"; mail-complaints-to="abuse@eternal-september.org"; posting-account="U2FsdGVkX195Rl1pQTYPAV06UuScNhvhUR/He1wfKrg=" X-Mailer: Mozilla 4.77 [en] (Windows NT 5.0; U) X-Accept-Language: en Cancel-Lock: sha1:BsF8T+gVZKUNpjUEJdiOe4yVhys= Xref: x330-a1.tempe.blueboxinc.net comp.programming.threads:366 Masakuni Oishi wrote: [...] > /***************/ > // Initially > atomic x(0), y(0); > > // Thread 1: > x.store(1, memory_order_relaxed); > > // Thread 2: > r1 = x.load(memory_order_relaxed); > y.store(1, memory_order_release); > > // Thread 3: > r2 = y.load(memory_order_acquire); > r3 = x.load(memory_order_relaxed); > /***************/ > > this code does not allow the outcome > r1 == 1 && r2 == 1 && r3 == 0 > under the C++0x memory model. Well, http://www.rdrop.com/users/paulmck/scalability/paper/N2745r.2011.03.04a.html "Example 1: Load/Load ... Thread 0: r1 = x.load(memory_order_relaxed); y.store(1, memory_order_release); Thread 1: r2 = y.load(memory_order_acquire); r3 = x.load(memory_order_relaxed); Thread 2 (required for assertion): x.store(1, memory_order_relaxed);" says that "the C++ memory model does not actually require the loads to be ordered in this case, since thread 0's relaxed store is not guaranteed to be seen in any particular order by thread 0's and 1's relaxed loads. " ("thread 0's relaxed store" is meant to say "thread 2's relaxed store" of course) regards, alexander.