u010484936 2016-01-26 20:41 采纳率: 0%
浏览 1370

一个完全无锁无原子的疑问,以及猜想?

先基于一个单生产单消费的情况,我写了如下一个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个生产者对应多个消费者,我们可以把一个生产者生产出来的产品对应成分成与多个消费者所对应。那么就不存在什么锁和原子了吧?同样的,对于多生产多消费的,我们可以以多的那一方(生产者或消费者)来划分。把少的以某种方法划分成多的那一方所对应的个数,这种模式只是在开启线程的时候耗一点(也许可能会加锁,但是只是在开线程的时候,这个时候来分配谁怎么生产,谁怎么消费),这样不就可以解决无锁无原子?当然这个想法只是在某些领域好用,我是一个写游戏后台的,所以考虑得比较局限,还请多多指教

  • 写回答

1条回答 默认 最新

  • threenewbee 2016-01-26 23:34
    关注

    你的代码不同步肯定不行,因为线程可以在函数执行到任何地方,甚至一条语句执行了一半被切换到另一个线程,它们不是原子化的。

    评论

报告相同问题?

悬赏问题

  • ¥20 关于#硬件工程#的问题,请各位专家解答!
  • ¥15 关于#matlab#的问题:期望的系统闭环传递函数为G(s)=wn^2/s^2+2¢wn+wn^2阻尼系数¢=0.707,使系统具有较小的超调量
  • ¥15 FLUENT如何实现在堆积颗粒的上表面加载高斯热源
  • ¥30 截图中的mathematics程序转换成matlab
  • ¥15 动力学代码报错,维度不匹配
  • ¥15 Power query添加列问题
  • ¥50 Kubernetes&Fission&Eleasticsearch
  • ¥15 報錯:Person is not mapped,如何解決?
  • ¥15 c++头文件不能识别CDialog
  • ¥15 Excel发现不可读取的内容