无锁队列
循环队列能够满足多线程下的无锁要求,但问题是使用数组实现的循环队列长度是固定的,需要处理队列满时的情况,这时可以暂停写操作,另外扩容也是一个选择,只是比较麻烦。
最近想了无锁链表的可能性,感觉还是可行吧。
链表节点:
struct node{
node* next;
void* value;
}
初始化先压入一个空节点,并设为赋值给读写节点。
读者判定读节点是否为空节点来判定队列是否为空,不为空时读取值,读节点前移。
写者每压数据时先压空节点,再将写节点的值赋值为数据值,最后改写节点为之前压入的空节点。
这种方式存在问题是每次都要压节点指针,这里如果new的话本身还是会有加锁机制吧。
没做测试...只提供一个思路。