使用DCAS解决ABA问题
代码如下:
#include <stdio.h>
#include <process.h>
#include <windows.h>
#include <vector>
#include <iostream>
using namespace std;
#define CAS(a,b,c) (InterlockedCompareExchangePointer((PVOID*)a,(PVOID)c,(PVOID)b) == b)
//XP下用_InterlockedCompareExchange64才能编译过?但生成的exe无法运行!!
#define DCAS(a,b,c) (InterlockedCompareExchange64((LONGLONG*)a,(LONGLONG)c,(LONGLONG)b) == b)
DWORD g_count = 0;
FILE * g_fp;
FILE * g_fp_ptr;
CRITICAL_SECTION g_cs;
struct Node;
union UNode
{
struct
{
DWORD count;
Node *self;
};
__int64 sum;
};
struct Node
{
UNode self;
void *data;
UNode next;
};
struct Queue
{
UNode head;
UNode tail;
};
//初始化:最开始需要有一个空的节点
void InitQueue(Queue *&queue)
{
Node *node = new Node;
node->self.count = InterlockedIncrement(&g_count);
node->self.self = node;
node->next.sum = 0;
queue = new Queue;
queue->head = queue->tail = node->self;
}
void UnInitQueue(Queue *queue)
{
if (queue != nullptr)
{
Node* node = queue->head.self;
Node* next = nullptr;
while (node != nullptr)
{
next = node->next.self;
delete node;
node = next;
}
delete queue;
}
}
void Enqueue(Queue *queue, void *data)
{
Node *node = nullptr;
UNode tail, next;
//new在vs2013下是线程安全的
//EnterCriticalSection(&g_cs);
node =