CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
山寨机中的战斗机! 程序优化工程师到底对IT界有没有贡献
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  C/C++ >  C语言

unix/linux下怎么样实现下面的多线程同步控制呢?

楼主mymmsc(热血老猫)2004-04-04 16:54:25 在 C/C++ / C语言 提问

有队列Data(数组)  
   
  线程A:   不停的插入数据到Data  
                动作:  
                if   没有锁定  
                        插入数据;  
                end   if  
   
  线程B:   不停的读取并删除数组Data的第一个元素Data[0]  
                动作:  
                if   没有锁定  
                        if   数组元素数目大于0  
                              读取数据Data[0],然后删除;  
                        else  
                              continue;  
                        endif  
                end   if  
   
   
  问题:  
  1、如果线程B同时启动很多个,那么由于A有同步控制,那么新添加的数据包会很慢,怎么处理?!  
  2、能否去掉A的同步控制,我考虑是可以去掉同步控制,因为A是在数组Data的后面添加数据。 问题点数:20、回复次数:11Top

1 楼mymmsc(热血老猫)回复于 2004-04-06 09:24:15 得分 0

怎么没有人理我啊???Top

2 楼w3guy(何去何从)回复于 2004-04-06 09:30:35 得分 0

不能去处A的锁定,可以减小锁定范围,比如你只在要对   数组元素数目+1   时再锁定。  
  问一句,你用什么同步机制?Top

3 楼mymmsc(热血老猫)回复于 2004-04-06 09:39:26 得分 0

用互斥锁Top

4 楼mechgoukiteng(变态是一种生活态度)回复于 2004-04-06 09:52:02 得分 0

你是对数组同步还是对代码块同步?Top

5 楼dreameasy(自由哥哥)回复于 2004-04-06 09:55:18 得分 0

up!Top

6 楼mymmsc(热血老猫)回复于 2004-04-06 10:00:23 得分 0

上面的伪代码写的很清楚,是对动态数组(或链表)的操作Top

7 楼wythust(begin with the end in mind)回复于 2004-04-06 10:13:49 得分 0

有问题,“不停的读取并删除数组Data的第一个元素Data[0]”Data[0]只有一个啊,删了就没了,建议用链表,每次读取头指针,开始删除  
  对于你的问题,我想可以去掉A的同步控制,因为两个进程实际上根本没有共享缓冲区,是可以同时操作的,删除操作加个控制标志就行了:当队列非空Top

8 楼w3guy(何去何从)回复于 2004-04-06 10:27:23 得分 15

像这种一个输入,多个输出用mutex   不好,当你的数组个数为0时,每个delete线程都在循环的lock/unlock,   你的insert   进程只得到   1/n   的机会去运行。  
  建议用semaphore    
  insert线程   调   sem_post,   delete   线程调sem_wait,这样如果数组个数为0时,delete   线程处于block   状态,不占cup。  
  另外你可以稍微把insert   线程的优先级别调高一点。Top

9 楼mymmsc(热血老猫)回复于 2004-04-06 10:29:45 得分 0

to     w3guy(Jaz)   :  
  你说的太对了,能给个例子吗?Top

10 楼mymmsc(热血老猫)回复于 2004-04-06 11:09:34 得分 0

to     w3guy(Jaz)   :  
  你说的太对了,能给个例子吗?  
  Top

11 楼w3guy(何去何从)回复于 2004-04-06 11:38:41 得分 5

我手头上没有例子,  
  你man   一下sem_init看看说明,  
  再看看这个sample:  
   
  http://developer.novell.com/ndk/doc/samplecode/libc_sample/libc_sample/PThreads.c.htmlTop

相关问题

  • 关于多线程控制
  • Unix的多线程问题
  • 多线程之间控制的问题!
  • MySQL如何进行多线程控制?
  • 关于多线程的控制
  • 如何控制多线程池
  • 急,Linux下的多线程编程
  • Linux下的多线程问题
  • linux多线程编程的问题
  • 求助!Linux多线程问题

关键词

  • 线程
  • 控制
  • 数据
  • 数组
  • 同步控制
  • 删除
  • 读取
  • 锁定
  • 元素
  • 去掉

得分解答快速导航

  • 帖主:mymmsc
  • w3guy
  • w3guy

相关链接

  • C/C++ Blog
  • C/C++类图书
  • C/C++类源码下载

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
北京创新乐知广告有限公司 版权所有, 京 ICP 证 070598 号
世纪乐知(北京)网络技术有限公司 提供技术支持
Copyright © 2000-2008, CSDN.NET, All Rights Reserved
GongshangLogo