QAtomicPointer<T> p;T* pT = p.fetchAndStoreRelaxed(NULL);delete pT;
QAtomicPointer<T> p; //общий указатель на что-то, который инициализирует один из потоков, а остальные используют// следовательно нужна проверить был ли указатель уже созданif(!p){ T * pt = new T; if( !p.testAndSetRelaxed(0, pt) ) { delete pt; }}
C++ (Qt)void ReplacePtr( T *& oldP, T * newP ){// ???}
C++ (Qt)void ReplacePtr( T *& oldP, T * newP ){ static QAtomicInt spinlock = 0; while(!spinlock.testAndSetRelaxed(0, 1)); // тут делаем нужные операции, например if(oldP) delete oldP; oldP = newP; spinlock = 0; //Обязательно после всего и обязательно должен выполниться, иначе deadlock}
ASMmov eax, spinlock_addressmov ebx, SPINLOCK_BUSYwait_cycle:lock xchg [eax], ebxcmp ebx, SPINLOCK_FREEjnz wait_cycle ;<body> mov eax, spinlock_addressmov ebx, SPINLOCK_FREElock xchg [eax], ebx
C++ (Qt)void ReplacePtr( T *& oldP, T * newP ){ static QAtomicInt spinlock = 0; while(!spinlock.testAndSetAcquire(0, 1)) {} T * doomed = oldP; oldP = newP; spinlock = 0; delete doomed;}
C++ (Qt)template <class T>void ReplacePtr( T *& oldP, T * newP ){ T * doomed; typedef QAtomicPointer <T> TAtom; TAtom * ta = (TAtom *) &oldP; for (;;) { doomed = oldP; if (ta->testAndSetAcquire(doomed, newP)) break; } delete doomed;}