unix/linux下怎么样实现下面的多线程同步控制呢?
有队列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




