生产者,消费者的问题
时间:2010-08-12
来源:互联网
- int insert_item(ITEM item)
- {
- if(tail_>= size_)
- {
- tail_ %= size_;
- }
- if((tail_ + 1) != head_)
- {
- //printf("The queue is full\n");
- item_buf_[tail_++] = item;
- return 0;
- }
- else
- return -1;
- }
-
- ITEM remove_item()
- {
- if(head_>= size_)
- {
- head_ %= size_;
- }
- if(head_ == tail_)
- {
- //printf("The queue is epmty\n");
- return NULL;
- }
- else
- return item_buf_[head_++];
- }
remove_item
主要看这两个方法的实现,
在insert的时候,如果((tail_ + 1) != head_)就丢掉此次插入的数据
在remove的时候,如果(head_ == tail_)就返回NULL
请高人指点小弟下,没有用锁,这个会有什么问题。item_buf_这个空间是当数组队列来用的。
一会线程存,一个线程取
除了会丢失数据,还会有别的问题么?
作者: jlccwss 发布时间: 2010-08-12
作者: zhangsuozhu 发布时间: 2010-08-12
回复 zhangsuozhu
给你来个短的
- int insert_item(ITEM item)
- {
- if(tail_>= size_)
- {
- tail_ %= size_;
- }
- if((tail_ + 1) != head_)
- {
- //printf("The queue is full\n");
- item_buf_[tail_++] = item;
- return 0;
- }
- else
- return -1;
-
- }
-
- ITEM remove_item()
- {
- if(head_>= size_)
- {
- head_ %= size_;
- }
-
- if(head_ == tail_)
- {
- //printf("The queue is epmty\n");
- return NULL;
- }
- else
- return item_buf_[head_++];
- }
在remove的时候,如果(head_ == tail_)就返回NULL
指点小弟下,没有用锁,这个会有什么问题。item_buf_这个空间是当数组队列来用的。
作者: jlccwss 发布时间: 2010-08-12
作者: mirnshi 发布时间: 2010-08-12
就是这个问题,不加锁有没有什么问题。
生产:在队尾+1等于队头的情况下,我不存数据
消费:在队头==队尾的情况下,我不取数据
作者: jlccwss 发布时间: 2010-08-12
就是这个问题,不加锁有没有什么问题。
生产:在队尾+1等于队头的情况下,我不 ...
jlccwss 发表于 2010-08-12 16:53
多线程下不可用。
作者: mirnshi 发布时间: 2010-08-12
一个线程存,一个线程取,为什么不可用,哪里会有问题,能说一下么,谢谢
作者: jlccwss 发布时间: 2010-08-12
一个线程存,一个线程取,为什么不可用,哪里会有问题,能说一下么,谢谢
jlccwss 发表于 2010-08-12 16:55
呵呵,这都属于操作系统课程里必考的。你的队列指针不会一致呀
作者: mirnshi 发布时间: 2010-08-12
热门阅读
-
office 2019专业增强版最新2021版激活秘钥/序列号/激活码推荐 附激活工具
阅读:74
-
如何安装mysql8.0
阅读:31
-
Word快速设置标题样式步骤详解
阅读:28
-
20+道必知必会的Vue面试题(附答案解析)
阅读:37
-
HTML如何制作表单
阅读:22
-
百词斩可以改天数吗?当然可以,4个步骤轻松修改天数!
阅读:31
-
ET文件格式和XLS格式文件之间如何转化?
阅读:24
-
react和vue的区别及优缺点是什么
阅读:121
-
支付宝人脸识别如何关闭?
阅读:21
-
腾讯微云怎么修改照片或视频备份路径?
阅读:28