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
    关注

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

    评论

报告相同问题?

悬赏问题

  • ¥15 MATLAB怎么通过柱坐标变换画开口是圆形的旋转抛物面?
  • ¥15 寻一个支付宝扫码远程授权登录的软件助手app
  • ¥15 解riccati方程组
  • ¥15 display:none;样式在嵌套结构中的已设置了display样式的元素上不起作用?
  • ¥15 使用rabbitMQ 消息队列作为url源进行多线程爬取时,总有几个url没有处理的问题。
  • ¥15 Ubuntu在安装序列比对软件STAR时出现报错如何解决
  • ¥50 树莓派安卓APK系统签名
  • ¥65 汇编语言除法溢出问题
  • ¥15 Visual Studio问题
  • ¥20 求一个html代码,有偿