C++ 队列queue中的一段玄学代码

代码:

  1. mtx.lock();
  2. printf("node %d push localW prepared,and local flag=%d,clock=%d\n",procID,localW.getFlag(),localW.getClock());
  3. printf("localQ is empty:%s\n",localQ.empty()?"true":"false");
  4. localQ.push(localW);
  5. printf("node %d push localW successfully,and front flag=%d,clock:%d\n",procID,localQ.front().getFlag(),localQ.front().getClock());
  6. printf("node %d push localW successfully,and local flag=%d,clock:%d\n",procID,localW.getFlag(),localW.getClock());
  7. mtx.unlock();

输出的结果就神奇了,给大家瞅瞅:

node 2 push localW prepared,and local flag=0,clock=0
localQ is empty:true
node 2 push localW successfully,and front flag=4,clock:24
node 2 push localW successfully,and local flag=0,clock:0

目前还未找到原因,找到原因我会更新。

---------------------------------------------------update-----------------------------------------------------------

虽然没有确切地找出是什么原因,但是根据一个程序员的经验,估计应该是因为压入的对象过于庞大,所以直接压对象,会导致压入失败。

因此,这一问题可以换一个思路来解决,这个思路也很有效,那就是压地址。

把作为对象的队列,变成作为对象地址的队列,这样队列的进出就只有地址,地址我们知道是一个很小的数据,因此肯定不会出错,至此问题解决。

新代码:

  1. mtx.lock();
  2. printf("node %d push localW prepared,and local flag=%d,clock=%d\n",procID,localW.getFlag(),localW.getClock());
  3. printf("localQ is empty:%s,queue size:%d\n",localQ.empty()?"true":"false",localQ.size());
  4. localQ.push(&localW);
  5. printf("node %d push localW successfully,and front flag=%d,clock:%d\n",procID,localQ.back()->getFlag(),localQ.back()->getClock());
  6. printf("node %d push localW successfully,and local flag=%d,clock:%d\n",procID,localW.getFlag(),localW.getClock());
  7. mtx.unlock();

新队列声明代码:

  1. queue<TheMatrix *> localQ;
  2. queue<TheMatrix *> globalQ;

新结果:

node 1 push localW prepared,and local flag=0,clock=0
localQ is empty:true,queue size:0
node 1 push localW successfully,and front flag=0,clock:0
node 1 push localW successfully,and local flag=0,clock:0

 

转载于:https://www.cnblogs.com/lumelon/p/6824255.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值