
Doug Gregor wrote:
The problem only seems to occur on PowerPC Mac, because the test is running fine on my Intel Mac. There's a gdb dump of the backtraces for all running threads below.
Removed from SVN. The main problem is that Mac does not have process-shared barrier/mutexes/condition variables and an emulation using spinlocks is used. Since my knowledge about atomic operations is *zero* my implementation of interprocess_condition might be wrong or just the atomic operations I'm using are not correctly implemented. I guess I should ask Boost thread-experts (Boost.Thread maintainers willing to help?) to write these synchronization primitives for me or/and beg for a simple atomic operation package in Boost. At least some that implement increment, cas, decrement, atomic read and read (full barrier semantics are enough for me, I just don't understand what acquire and release are ;-) ). The implementation of the emulated barrier is pretty simple: inline barrier::barrier(unsigned int count) : m_threshold(count), m_count(count), m_generation(0) { if (count == 0) throw std::invalid_argument("count cannot be zero."); } inline bool barrier::wait() { scoped_lock<interprocess_mutex> lock(m_mutex); unsigned int gen = m_generation; if (--m_count == 0){ m_generation++; m_count = m_threshold; m_cond.notify_all(); return true; } while (gen == m_generation){ m_cond.wait(lock); } return false; } so I guess there is problem with my emulated condition implementation or with atomic operations (which are taken from apache run-time library). Regards, Ion