Maxim Egorushkin wrote:
[...]
> Seems like the issue is undefined behaviour when casting away volatile. 
> Do I get it right?

Yes, UB is the issue ("one of the most obvious tips of the iceberg").

Well, more on volatiles (low level stuff) can be found below. Uhmm, 
as for "higher level safety" (and also efficiency)... you might want 
to take a look at ADA's "protected types" (and the "proxy model"):

http://groups.google.com/groups?threadm=3D7E18EB.BC80C2EB%40web.de
http://groups.google.com/groups?threadm=3D7E24FC.E1AE86B0%40web.de
(Subject: Re: POSIX Threads and Ada)

<Forward Inline>

-------- Original Message --------
Date: Fri, 04 Jul 2003 11:30:56 +0200
Newsgroups: comp.programming.threads
Subject: Re: Does anyone think 'volatile' is a platform-independent 
way to make variable access thread safe?
References: ... <[EMAIL PROTECTED]>

Ziv Caspi wrote: ...

Ziv, "volatile" stuff IS brain-damaged. Really. kinda-<copy&paste>

Originally, C/C++ volatiles were indeed designed having memory mapped 
I/O ("registers"/"ports") in mind. At that time hardware was rather 
simplistic and didn't do any reordering in either "ordinal" or "I/O" 
space. Modern hardware COULD reorder memory accesses in ALL spaces. 
So, you basically need almost the same reordering constrains (see the 
links below) for portable device driver programming as for threading. 
The situation is actually kinda more complicated because for device 
drivers you'd need to "control" BOTH spaces -- e.g. if you publish a 
bunch of structure addresses and those structure meant to be 
read/write by a device, you'll need to ensure "cross-space" ordering. 

Unfortunately, the upcoming <iohw.h> and <hardware> still lacks 
facilities (ala "msync" stuff -- pls see below) to do that... unless 
they really want to impose "total ordering" if you use any read/write 
IO calls. 

Later, volatiles were kinda {re-}used for setjmp/longjmp stuff in 
order to spill the locals to memory (and to reload them after the 
jump). Finally, volatiles are also needed for static sig_atomic_t's. 
Both these uses of volatiles are purely "single-threaded". Ideally, 
we should get rid completely of setjmp/longjmp (ISO C should adopt 
C++ exceptions... but after they will be repaired, of course) and 
also asynchronous signals (threads shall replace them). Given the 
upcoming <iohw.h> and <hardware>, C/C++ volatiles could then be 
deprecated as well. Now, back to threading and C++... here's some 
C++ code for "curious" folks who can "speak C++":

http://www.terekhov.de/pthread_refcount_t/experimental/refcount.cpp

Some wording about msync "semantics" can be found here:

http://www.google.com/groups?selm=3EE0CA46.593F938B%40web.de
(Subject: Re: Asynchronous queue without synchronization primitives)

Reference counting operation are described here:

http://www.terekhov.de/pthread_refcount_t/draft-edits.txt

Comments are quite welcome. TIA.

regards,
alexander.

_______________________________________________
Unsubscribe & other changes: http://lists.boost.org/mailman/listinfo.cgi/boost

Reply via email to