Boost logo

Boost :

From: Ion Gaztañaga (igaztanaga_at_[hidden])
Date: 2007-08-21 15:33:30


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


Boost list run by bdawes at acm.org, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk