vecotr<socket> client_list; // 存放连接的客户端// 主线程
sock = accept(); // 阻塞, 返回连入的socket;
enter_criticalsection(); // 进入临界区
client_list.push_back(skck);
leave_criticalsection(); // 离开临界区// 发送线程
enter_criticalsection(); // 进入临界区
for ( 遍历client_list )
逐个发送消息..
leave_criticalsection(); // 离开临界区
为了线程对client_list的同步..
发送线程的for循环在临界区中..
而for循环可能要执行很多遍, 而且发送消息的时间可能也比较长..
这里存在的问题就是, 发送线程的临界区里的代码执行时间太长了.
这样会导致主线程等很久..
有没有办法解决这个问题呢???我对多线程不太会..
希望大神能传授一些技巧..
在此谢过..多线程c++同步编程技巧
sock = accept(); // 阻塞, 返回连入的socket;
enter_criticalsection(); // 进入临界区
client_list.push_back(skck);
leave_criticalsection(); // 离开临界区// 发送线程
enter_criticalsection(); // 进入临界区
for ( 遍历client_list )
逐个发送消息..
leave_criticalsection(); // 离开临界区
为了线程对client_list的同步..
发送线程的for循环在临界区中..
而for循环可能要执行很多遍, 而且发送消息的时间可能也比较长..
这里存在的问题就是, 发送线程的临界区里的代码执行时间太长了.
这样会导致主线程等很久..
有没有办法解决这个问题呢???我对多线程不太会..
希望大神能传授一些技巧..
在此谢过..多线程c++同步编程技巧
解决方案 »
- 界面 如何实现拖曳功能
- VC++6.0与HTML/XML的深层关系
- 请看下面代码,有关字体高度的问题。
- 我靠,程序的完美版就要出来鸟
- [求助]为什么debug下的.exe文件的执行结果和vc下Ctrl+F5的执行结果不一样?
- 为什么在CRichEditCtrl对象中不能注册一个COleDropTarget对象?
- 刚学vc,就被一个简单问题给难住了`
- 求本VC++ Opengl书
- 偶心情十分糟,决定在最近3天内,陆续散掉1000分,每贴100分,每贴只分给5名象我心情一样糟的哥们,每人20分。(第六个100分)
- 谁有比较好的VC源代码?
- 多线程同步, 大神快点来!!!
- 奇怪的问题,我用VC编译OCX程序后,可以打开带这个控件的网页,而同样的OCX,自己注册后,同样的网页却不能打开
client_list.push_back(skck);
leave_criticalsection(); // 离开临界区你这个cilent——list是共享区域么?
加入临界区干嘛?
可以增加消息循环等
while(1) {
::PeekMessage();
::DispatchMessage()
}
然后就可以不用加锁的遍历另一个list或数组
我以前的做法是先开辟一定个数的数组(譬如100000)
遍历(群发、广播)基本上是lockfree的,只是插入和删除(客户端连接和断开)多耗时间
看实际衡量
for ( 遍历client_list )
逐个发送消息..
leave_criticalsection(); // 离开临界区
你是如何发消息的,用PostMessage不用等直接返回,至多走一遍循环还有为什么要循环一圈了? 只发新增加的不行吗?从这2点去考虑优化
client_list是两个线程共享的变量.
发送线程中需要遍历这个变量, 对所有socket发送消息.// 发送线程
enter_criticalsection(); // 进入临界区
for ( 遍历client_list )
逐个发送消息..
leave_criticalsection(); // 离开临界区