+ -
当前位置:首页 → 问答吧 → 生产者,消费者的问题

生产者,消费者的问题

时间:2010-08-12

来源:互联网

本帖最后由 jlccwss 于 2010-08-12 16:56 编辑
  1. int insert_item(ITEM item)
  2. {
  3.         if(tail_>= size_)
  4.        {
  5.                 tail_ %= size_;
  6.         }
  7.         if((tail_ + 1)  != head_)
  8.         {
  9.                 //printf("The queue is full\n");
  10.                 item_buf_[tail_++] = item;
  11.                 return 0;
  12.         }
  13.         else
  14.                 return -1;
  15. }

  16. ITEM remove_item()
  17. {
  18.         if(head_>= size_)
  19.        {
  20.                 head_ %= size_;
  21.         }
  22.         if(head_ == tail_)
  23.         {
  24.                 //printf("The queue is epmty\n");
  25.                 return NULL;
  26.         }
  27.         else
  28.                 return  item_buf_[head_++];
  29. }
复制代码
insert_item
remove_item
主要看这两个方法的实现,
在insert的时候,如果((tail_ + 1)  != head_)就丢掉此次插入的数据
在remove的时候,如果(head_ == tail_)就返回NULL

请高人指点小弟下,没有用锁,这个会有什么问题。item_buf_这个空间是当数组队列来用的。

一会线程存,一个线程取

除了会丢失数据,还会有别的问题么?

作者: jlccwss   发布时间: 2010-08-12

太长。又是C++的。我懒了。等其它高人

作者: zhangsuozhu   发布时间: 2010-08-12

本帖最后由 jlccwss 于 2010-08-12 16:51 编辑

回复 zhangsuozhu


    给你来个短的
  1. int insert_item(ITEM item)
  2. {
  3.         if(tail_>= size_)
  4.        {
  5.                 tail_ %= size_;
  6.         }
  7.         if((tail_ + 1)  != head_)
  8.         {
  9.                 //printf("The queue is full\n");
  10.                 item_buf_[tail_++] = item;
  11.                 return 0;
  12.         }
  13.         else
  14.                 return -1;

  15. }

  16. ITEM remove_item()
  17. {
  18.         if(head_>= size_)
  19.        {
  20.               head_ %= size_;
  21.         }

  22.         if(head_ == tail_)
  23.         {
  24.                 //printf("The queue is epmty\n");
  25.                 return NULL;
  26.         }
  27.         else
  28.                 return  item_buf_[head_++];
  29. }
复制代码
在insert的时候,如果((tail_ + 1)  != head_)就丢掉此次插入的数据
在remove的时候,如果(head_ == tail_)就返回NULL

指点小弟下,没有用锁,这个会有什么问题。item_buf_这个空间是当数组队列来用的。

作者: jlccwss   发布时间: 2010-08-12

循环列表不加锁吗?

作者: mirnshi   发布时间: 2010-08-12

回复 mirnshi


    就是这个问题,不加锁有没有什么问题。

生产:在队尾+1等于队头的情况下,我不存数据
消费:在队头==队尾的情况下,我不取数据

作者: jlccwss   发布时间: 2010-08-12



QUOTE:
回复  mirnshi


    就是这个问题,不加锁有没有什么问题。

生产:在队尾+1等于队头的情况下,我不 ...
jlccwss 发表于 2010-08-12 16:53



多线程下不可用。

作者: mirnshi   发布时间: 2010-08-12

回复 mirnshi


    一个线程存,一个线程取,为什么不可用,哪里会有问题,能说一下么,谢谢

作者: jlccwss   发布时间: 2010-08-12



QUOTE:
回复  mirnshi


    一个线程存,一个线程取,为什么不可用,哪里会有问题,能说一下么,谢谢
jlccwss 发表于 2010-08-12 16:55



呵呵,这都属于操作系统课程里必考的。你的队列指针不会一致呀

作者: mirnshi   发布时间: 2010-08-12