最適化せずにこれを完全にコンパイルする
void Add(T data)
{
node<T> *pNode = new node<T>;
pNode->m_pNext = NULL;
pNode->m_data = data;
uint32_t cPushes;
uint32_t cPops;
node<T> *pTail;
while (true)
{
cPushes = m_cPushes;
cPops = m_cPops;
pTail = (node<T>*)m_pTail;
if (cPushes != m_cPushes)
continue;
if (!pTail)
if (CAS2(&m_pTail, NULL, cPushes, (uint32_t)pNode, cPushes +1))
break;
else if (CAS(&pTail->m_pNext, NULL, (uint32_t)pNode))
break;
else
CAS2(&m_pTail, (uint32_t)pTail, cPushes, (uint32_t)pTail->m_pNext, cPushes + 1);
}
CAS2(&m_pHead, NULL, cPops, (uint32_t)pNode, cPops + 1);
CAS2(&m_pTail, (uint32_t)pTail, cPushes, (uint32_t)pNode, cPushes + 1);
}
逆アセンブル: http: //pastebin.com/7EaH3whu(巨大で、SOのコードタグを壊してしまうため、pastebinned)
あなたがそれを見ると、ほぼすべてのジャンプ命令はそれらのアドレスが混同されています
たとえば、次のステートメントが失敗した場合:'if(!pTail)'、'else if'で続行する代わりに、ループの先頭にジャンプします(実際には、ジャンプの先頭にジャンプします。ループ)
完全なコード: http: //pastebin.com/U5qGgT0E