
On 4/19/07, Dmitriy V'jukov <dvyukov@gmail.com> wrote:
Peter Dimov wrote:
There's also a hidden ordinary store to the vtable pointer. In general, when passing an object X from thread A to thread B, you are expected to ensure the necessary visibility (and not the author of X). Usually the queue that
you're using for message passing will contain the acquire/release pair in pop/push. Otherwise you wouldn't be able to pass ordinary objects between threads. Or to take a simple example:
Thank you very much. Now I understand. I underestimate the "pass to another thread" procedure, that must contain all necessary fences to ensure visibility of counter variable.
In particular, looking at your original example:
shared_count volatile* sc;
void thread1() { //... sc = new shared_count();
*** need a write barrier here, so that other thread doesn't see 'sc' set before its contents ***
//... }
void thread2() { //...
*** need a read barrier when reading 'sc', so that you don't see it before its contents ***
while (!sc) Sleep(1); sc->inc(); if (!sc->dec()) delete sc; //... }
Tony