原理:利用原子操作(__sync_bool_compare_and_swap)解决多线程之间的资源竞争关系。
1. 队列结点
typedef struct {
void* m_data; //存放的数据
volatile int m_state; //读写状态, 0为可写,1为可读
}queue;
2. 初始化队列
queue m_queue[max]; //初始化队列
volatile uint64_t m_read_id = 0; //读的位置
volatile uint64_t m_write_id = 0; //写的位置
3. 写入数据
do{
uint64_t cid = m_write_id;
if (m_queue[cid].m_state == 1){
return -1;//没有位置可写
}
//多线程争抢位置
if (!__sync_bool_compare_and_swap(&m_write_id, cid, cid+1)){
continue;//争抢失败,重试
}
//争抢成功
int id = (cid-1)%max;
m_queue[id].m_data = data; //写入数据
uint64_t clid = m_queue[id].m_state;
//设置可读
if (!__sync_bool_compare_and_swap(&(m_queue[id].m_state), clid, 1)){
m_queue[id].m_state = 1; //强制设置可读
}
break; //写入成功。
}while(true);
3. 读取数据
do{
int id = m_read_id % max;
int clid = m_queue[id]->m_state;
if (clid != 1){
return 0; //没有数据
}
//多线程争抢
if (!__sync_bool_compare_and_swap(&m_read_id, id, id+1)){
continue;//争抢失败,重试
}
//争抢成功。
void* data = m_queue[id].m_data;
//设置可写
if (!__sync_bool_compare_and_swap(&(m_queue[id].m_state), clid, 0)){
m_queue[id].m_state = 0; //强制设置可写
}
return data; //返回数据
}while(true);