C++ (Qt)struct CData { ... CData * mNext; // следующий в списке static volatile CData * mDataFirst; // указатель на первый элемент списка (голова) static volatile CData * mDataLast; // указатель на последний элемент списка (хвост)};
C++ (Qt)void Push( CData * data ){ while (true) { CData * temp = CData::mDataFirst; data->mNext = temp; if (CompareAndSwap(&CData::mDataFirst, temp, data)) break; }}
C++ (Qt)struct CThread { CData * Pop( void ); CData * mStackData; CData * mDoomedList; CData * mFreeList; size_t mNumDoomed, mNumFree;};
C++ (Qt)bool ShouldDelete( CData * doomedData, const vector <CThread *> & thr ){ for (size_t i = 0; i < thr.size(); ++i) if (thr[i]->mStackData == doomedData) return false; return true; }
C++ (Qt)CData * CThread::Pop( void ){ CData * temp; while (true) { mStackData = CData::mDataFirst; temp = CData::mDataFirst; if (mStackData != temp) continue; if (!temp) break; // stack is empty bool Ok = CompareAndSwap(&CData::mDataFirst, temp, temp->mNext); mStackData = 0; if (Ok) break; } return temp;}
mStackData = CData::mDataFirst; temp = CData::mDataFirst; if (mStackData != temp) continue; /// всегда равно
C++ (Qt) mStackData = CData::mDataFirst; temp = CData::mDataFirst; if (mStackData != temp) continue;
C++ (Qt)mStackData = temp = CData::mDataFirst;