> Another conclusion from the cited text is that in contrast with whatIt all depends upon what threading standard you are using. If GCC is going to support POSIX threading, it cannot require that thread-shared data be marked 'volatile' since POSIX does not require this. It can offer semantic guarantees for volatile-qualified data if it wants to. But POSIX provides a set of guarantees that do not require marking data as 'volatile' and if GCC is going to support POSIX threading, it has to support providing those guarantees. As far as I know, no threading standard either requires 'volatile' or states that it is sufficient for any particular purpose. So there seems to be no reason to declare thread-shared variables as volatile except as some kind of platform-specific optimization. POSIX mutexes are sufficient. They are necessary if there is no other way to get the guarantees you need. Nothing prevents GCC from providing any guarantees it wants for 'volatile' qualified data. But POSIX mutexes must work as POSIX specifies or GCC cannot support POSIX threading. This is the nightmare scenario (thanks to Hans-J. Boehm): int x; bool need_to_lock; pthread_mutex_t mutex; for(int i=0; i<50; i++) { if(unlikely(need_to_lock)) pthread_mutex_lock(&mutex); x++; if(unlikely(need_to_lock)) pthread_mutex_unlock(&mutex); } Now suppose the compiler optimizes this as follows: register=x; for(int i=0; i<50; i++) { if(need_to_lock) { x=register; pthread_mutex_lock(&mutex) register=x; } register++; if(need_to_lock) { x=register; pthread_mutex_unlock(&mutex); register=x; } } x=register; This is a perfectly legal optimization for single-threaded code. It may in fact be an actual optimization. Clearly, it totally destroys threaded code. This shows that, unfortunately, the normal assumption that not knowing anything about the pthread functions ensures that optimizations won't break them is incorrect. DS -
| david | Re: Dual-Licensing Linux Kernel with GPL V2 and GPL V3 |
| Bart Van Assche | Integration of SCST in the mainstream Linux kernel |
| Greg KH | [GIT PATCH] driver core patches against 2.6.24 |
| Heiko Carstens | Re: -mm merge plans for 2.6.23 -- sys_fallocate |
git: | |
| David Miller | Re: [GIT]: Networking |
| Jarek Poplawski | [PATCH] pkt_sched: Destroy gen estimators under rtnl_lock(). |
| Gerrit Renker | [PATCH 05/37] dccp: Cleanup routines for feature negotiation |
| Lennert Buytenhek | [PATCH 16/39] mv643xx_eth: get rid of ETH_/ethernet_/eth_ prefixes |
