#include "stdlib.h" #include "stdio.h" #include <pthread.h> #define MAXLEN 2 #define CAS __sync_bool_compare_and_swap typedef struct { int elem; int status;//用于状态监测 }node; typedef struct { node elePool[MAXLEN]; int front; int rear; }queue; enum { EMPTY =1, FULL, }; queue g_que; void initQue() { int i = 0; g_que.front = 0; g_que.rear = 0; for(i=0;i<MAXLEN;i++) { g_que.elePool[i].status = EMPTY; } return; } int enque(int elem) { do { if((g_que.rear+1)%MAXLEN == g_que.front) { return -1; } }while(!CAS(&(g_que.elePool[g_que.rear].status),EMPTY,FULL)); g_que.elePool[g_que.rear].elem = elem; printf("in--%d(%lu)\n",elem,pthread_self()); CAS(&(g_que.rear),g_que.rear,(g_que.rear+1)%MAXLEN); return 0; } int deque(int* pElem) { do { if(g_que.rear == g_que.front) { return -1; } }while(!CAS(&(g_que.elePool[g_que.front].status),FULL,EMPTY)); *pElem = g_que.elePool[g_que.front].elem; printf("out--%d(%lu)\n",*pElem,pthread_self()); CAS(&(g_que.front),g_que.front,(g_que.front+1)%MAXLEN); return 0; }
#include "stdlib.h" #include "stdio.h" #include <pthread.h> #define MAXLEN 2 #define CAS __sync_bool_compare_and_swap #define FAA __sync_fetch_and_add #define FAS __sync_fetch_and_sub typedef struct { int elem; int status;//用于状态监测 }node; typedef struct { node elePool[MAXLEN]; int front; int rear; int writeableCnt;//可以写入的个数 int readableCnt; //可以读出的个数 }queue; enum { EMPTY =1, FULL, }; queue g_que; void initQue() { int i = 0; g_que.front = 0; g_que.rear = 0; g_que.readableCnt = 0; g_que.writeableCnt = MAXLEN; for(i=0;i<MAXLEN;i++) { g_que.elePool[i].status = EMPTY; } return; } int enque(int elem) { int pos = 0; if(FAS(&(g_que.writeableCnt),1) <= 0) { FAA(&(g_que.writeableCnt),1); return -1; } CAS(&(g_que.rear),g_que.rear,g_que.rear%MAXLEN); pos = FAA(&(g_que.rear),1)%MAXLEN; g_que.elePool[pos].elem = elem; CAS(&(g_que.elePool[pos].status),EMPTY,FULL); FAA(&(g_que.readableCnt),1); printf("in--%d(%lu)pos(%d)\n",elem,pthread_self(),pos); return 0; } int deque(int* pElem) { do { if(FAS(&(g_que.readableCnt),1) <= 0) { FAA(&(g_que.readableCnt),1); return -1; } }while(!CAS(&(g_que.elePool[g_que.front].status),FULL,EMPTY)); *pElem = g_que.elePool[g_que.front].elem; printf("out--%d(%lu)pos(%d)\n",*pElem,pthread_self(),g_que.front); CAS(&(g_que.front),g_que.front,(g_que.front+1)%MAXLEN); FAA(&(g_que.writeableCnt),1); return 0; }
转载请注明原始出处:http://www.cnblogs.com/chencheng/p/3527692.html
原文:http://www.cnblogs.com/chencheng/p/3527692.html