unsigned int pull() { int stage = _stage.load( std::memory_order_relaxed ); bool changed = _state[stage].changed.load( std::memory_order_relaxed ); if( changed ) { _state[_out].changed.store( false, std::memory_order_relaxed ); _out = _stage.exchange( _out, std::memory_order_acquire ); return _state[_out].frames; } return 0; }
void *thread_func(void *ptr) { int self = (int)(size_t)(ptr); for (int i = 0; i < 1000; ++i) { auto newitem = new Item(); newitem->value = (self * 1000) + i; auto old = last.exchange(newitem); if (!old) { liststart = newitem; } else { old->next = newitem; } sched_yield(); } return NULL; }
void push( unsigned int frames ) { _state[_in].frames = frames; _state[_in].changed.store( true, boost::memory_order_relaxed ); _in = _stage.exchange( _in, boost::memory_order_release ); }
bool deactivate_() { return ACTIVE == state_.exchange( DEACTIVE); }