
I ran across this bug while running on a 2.6.9 Linux kernel. Since that kernel version doesn't have native interprocess mutexes and condition variables the interprocess library uses some emulation code. The x86 verion of the emulated semaphore uses atomic_dec32() from atomic.hpp but that function wasn't behaving properly. The following change in oost/interprocess/detail/atomic.hpp made things work properly: BEFORE: inline boost::uint32_t atomic_dec32(volatile boost::uint32_t *mem) { unsigned char prev; asm volatile ("lock; decl %1;\n\t" "setnz %%al" : "=a" (prev) : "m" (*(mem)) : "memory", "cc"); return prev; } AFTER: inline boost::uint32_t atomic_dec32(volatile boost::uint32_t *mem) { boost::uint32_t prev; // acts like an atomic 'return (*mem)--;' asm volatile ("movl $-1, %0;\n\t" "lock; xaddl %0, %1" : "=r" (prev) : "m" (*(mem)) : "memory", "cc" ); return prev; } -glenn