先基于一个单生产单消费的情况,我写了如下一个class:
template
class SingleLockFree
{
public:
SingleLockFree()
{
m_tail = new Node();
m_Head = m_tail;
}
~SingleLockFree()
{
//做最后未处理的内存的释放
}
void Push(T t)//生产线程
{
Node* p = new Node();//内存分配待优化
m_tail->_data = t;
m_tail->_next = p;
m_tail = p;
}
bool Pop(T& t)//消费线程
{
if (m_Head == m_tail)
return false;
Node* p = m_Head;
m_Head = p->_next;
t = p->_data;
delete p;
return true;
}
private:
struct Node
{
T _data;
Node* _next = nullptr;
};
Node* m_Head;//头
Node* m_tail;//当前
};
这样只在一个生产线程和一个消费消费线程使用是不会出问题的吧?
既然有这种模式,那我们为什么不可以把多生产多消费把他单一化,比如说:1个生产者对应多个消费者,我们可以把一个生产者生产出来的产品对应成分成与多个消费者所对应。那么就不存在什么锁和原子了吧?同样的,对于多生产多消费的,我们可以以多的那一方(生产者或消费者)来划分。把少的以某种方法划分成多的那一方所对应的个数,这种模式只是在开启线程的时候耗一点(也许可能会加锁,但是只是在开线程的时候,这个时候来分配谁怎么生产,谁怎么消费),这样不就可以解决无锁无原子?当然这个想法只是在某些领域好用,我是一个写游戏后台的,所以考虑得比较局限,还请多多指教