文档文库
手机版
投诉建议
热门搜索:
心得体会
演讲稿
思想汇报
首页
心得体会
学习心得体会
培训心得体会
军训心得体会
社会实践
作风建设
工作心得体会
教育心得体会
演讲稿
演讲稿格式
演讲稿范文
竞聘演讲稿
师德演讲稿
三分钟演讲稿
思想汇报
思想汇报范文
转正思想汇报
大学生思想汇报
季度思想汇报
教师思想汇报
工作计划
工作计划格式
工作计划开头
工作计划结尾
总结与计划
工作计划模板
工作总结
年终工作总结
年度工作总结
个人工作总结
实习报告
实习报告范文
实习计划范文
实习鉴定范文
实习报告内容
个人简历
求职简历
简历范文
简历模板
简历表格
简历格式
祝福语
春节
除夕
元宵
端午节
合同范文
合同范本
合同样本
合同范本格式
首页
>
多线程编程中应该注意的问题
多线程编程中应该注意的问题
发布时间:2014-06-05 来源:
文档文库
小
中
大
字号:
手机查看
多线程编程中应该注意的问题
1.
线程的优先级
多线程编程中要注意协调好各个线程的优先级。一般来说,控制线程的优先级要高于
Worker
线程。这样做,可以保证
Client
(最终用户或者其他模块)尽快得到响应。当控
制线程是与最终用户交互的界面线程时更应如此,如果界面线程优先级较低,界面可能
较长时间没有反应,用户很可能会怀疑命令是不是还没有开始执行。下面两张图给出了
控制线程优先级不同对
Client
造成不同响应时间的对比。
用户
请求
响
应
时
间
控制线程
Worker
线程
通知
Worker
处理请求
线程切换
工作中…
请求正在处理
线程切换
线程切换
工作中…
通知用户请求处理完毕
控制线程低优先级,
Worker
线程高优先级
Fig 1.1
控制线程优先级低,对用户响应时间较长
用户
请求
响应时间
控制线程
Worker
线程
请求正在处理
通知
Worker
处理请求
线程切换
工作中…
线程切换
线程切换
工作中…
通知用户请求处理完毕
控制线程高优先级,
Worker
线程低优先级
Fig 1.2
控制线程优先级高,对用户响应时间较短
2.
防止栈溢出
这个问题不只存在在多线程编程中。防止栈溢出可以参考下面几条建议:
1
不在函数体内定义特别大的栈变量,
必须要定义的时候,
可以使用
new
在堆上分配。
2
传递参数时,大的参数(如结构体,类)使用按指针传递,小的参数(如基本数据
类型)使用按值传递。
1.
分配和参数大小
相同的空间。
2.
调用拷贝构造函
数构造一个对象。
3.
将构造的对象
压入堆栈。
Parameter
Memory
Copy of Parameter
压
栈
参数
-
大的对象
Fig 2.1
大对象作为参数时,按值传递的过程
1.
取指
2.
创建指针的一个拷贝
3.
将创建的指针
压入堆栈。
堆栈
&Parameter
Copy of &Parameter
Parameter
压
栈
参数
-
大的对象
堆栈
Fig 2.2
大对象作为参数时,按指针传递的过程。
由
Fig 2.1
和
Fig 2.2
可以看出,对于较大的对象,按指针的传递的资源消耗较小,
空间上,仅需把一个指针压栈;
时间上,
省去了拷贝构造函数的调用。
所以在传递
大的对象时,应该使用按指针传递。
1.
创建参数的一个拷贝,
基本数据类型,无须调用拷贝构造函数
2.
将创建的拷贝
压入堆栈。
Parameter
Copy of Parameter
参数
-
基本数据类型
压
栈
Copy Of Parameter
堆栈
Fig 2.3
参数为基本类型时,按值传递的过程
1.
取地址
2.
创建指针的一个拷贝
3.
将创建的拷贝
压入堆栈。
Parameter
&Parameter
Copy of &Parameter
参数
-
基本数据类型
压
栈
Copy of &Parameter
堆栈
Fig 2.4
参数为基本类型时,按指针传递的过程。
对比
Fig 2.3
和
Fig 2.4
可以看出,对于基本数据类型,按指针传递的方法反而会消耗较多的
时间,而且当参数所占的字节数小于一个指针所占的字节数(
4
个字节)时,按指针传递也
会消耗较多的空间。所以当参数为基本数据类型时,应该使用按值传递。
3.
Run
函数中
Event
的处理顺序
在
Run
函数同时
Wait
到两个或者以上
Event
时,
要特别注意处理这些
Event
的先后顺序,
避免因处理顺序不当引起的问题。
如果
Wait
函数每次只能接收一个事件,则上述问题不需要特别关注。
4.
提高控制线程的响应速度
1
减轻控制线程的负担,把更多的工作交给
Worker
线程来做。这么做的原因和第一
条一样,是为了提高控制线程的响应速度,从而提高
Client
的满意度。
2
注意
Worker
线程中信号量的使用,
防止
Worker
线程长时间堵塞控制线程。
典型的,
控制线程和
Worker
线程会同时访问一个成员变量,并且其中至少有一个线程还要
修改这个成员变量,如果
Worker
线程用信号量
Lock
了这个成员变量,然后做一些
费时的工作(比如操作数据库)
,那么在它完成这些工作并
Unlock
这个成员变量之
前,控制线程访问这个成员变量时都会被堵塞。所以,应该尽量减少
Worker
线程
Lock
的时间。下图中演示了堵塞发生的过程,红色的部分表示控制线程被堵塞了。
Client
控制线程
Update m_pData
SetEvent
Update has started
Worker
线程
Lock m_pData
Get m_pData
*
*
Lock m_pData
Read DB to m_pData
消息
1
费时操作
Unlock m_pData
这里堵塞了
Copy m_pData to pData
Unlock m_pData
Return pData
Fig 4.1 Worker
线程堵塞控制线程的发生过程
Client
Update m_pData
控制线
Worker
线程
SetEvent
Update has started
Get m_pData
Read DB to pData
费时操作
Copy m_pData to pData
Lock m_pData
Unlock m_pData
Return pData
Lock m_pData
m_pData = pData
Unlock m_pData
Fig 4.2
防止
Woker
线程堵塞控制线程的方法。
上图给出的解决方法实际上是尽量减少
Worker
线程的
Lock
时间,把
DB
读出的数据暂
时先放在临时变量中,仅当需要更新
m_pData
时才开始
Lock
。
5.
做一个强有力的控制线程,减少
Worker
线程被唤醒的次数
对来自
Client
的事件,控制线程应该加一些基本的过滤,对于可以简单地判断出不需要
Worker
线程处理的事件,
如一些在当前状态下不能处理,
不需要处理,
或者处理起来不
费多少时间的事件,应该直接处理掉或者丢弃掉,而不是全部都发送给
Worker
线程。
例如,
Map
中处理描画事件的方式就值得学习,当追加描画和擦除后再描画,两个事件
同时到来时,
Map
的处理方式是仅处理擦除后再描画,追加描画直接忽略了。
6.
注意信号量的使用
在一个线程运行过程中,应该避免出现以下的使用方法:
Func
{
Lock(;
…
Unlock(;
…
Lock(;
…
Unlock(;
}
这是因为,如果第一次
Unlock
和第二次
Lock
之间,成员变量的值可能发生了变化,而
如果
Func
函数恰好在两次
Lock
的时候都用到了那个发生了变化的成员变量,
那么错误
就有可能发生了。
?
?
?
?
?
?
1
Update m_pIReal3D.lIndex
Update m_pIReal3D
Lock m_pIReal3D
Lock m_pIReal3D
lIndex = m_pIReal3D.lIndex
?
?
?
?
1
?
?
?
?
2
?
?
?
?
2
Unlock m_pIReal3D
m_pIReal3D.Realease(
?
?
?
m_pIReal3D
?
?
?
?
?
?
?
?
?
?
?
lIndex = CalcNewIndex(lIndex
Unlock m_pIReal3D
m_pIReal3D = new CReal3D(
Lock m_pIReal3D
m_pIReal3D.lIndex = lIndex
Unlock m_pIReal3D
Fig 6.1
多次
Lock
时出现的问题。
可以看出上图中,
模块线程
1
两次
Lock
之间,
m_pIReal3D
的值已经发生了变化,
这样
会导致意想不到的错误。下图给出了这种问题的解决方法。
?
?
?
?
?
?
1
Update m_pIReal3D.lIndex
?
?
?
?
1
?
?
?
?
2
?
?
?
?
2
Update m_pIReal3D
Lock m_pIReal3D
Lock m_pIReal3D
pIReal3D = m_pIReal3D
Unlock m_pIReal3D
m_pIReal3D.Realease(
lIndex = pIReal3D.lIndex
m_pIReal3D = new CReal3D(
Unlock m_pIReal3D
lIndex = CalcNewIndex(lIndex
pIReal3D.lIndex = lIndex
Fig 6.2
防止多次
Lock
出现问题。
本文来源:
https://www.2haoxitong.net/k/doc/3fe3061c2e3f5727a4e96220.html
《多线程编程中应该注意的问题.doc》
将本文的Word文档下载到电脑,方便收藏和打印
推荐度:
点击下载文档
文档为doc格式
分享到:
相
关
案
例
正在进行安全检测...
2024-04-27
正在进行安全检测...
2024-04-27
安全验证
2024-04-27
正在进行安全检测...
2024-04-27
安全验证
2024-04-27
安全验证
2024-04-27
正在进行安全检测...
2024-04-27
正在进行安全检测...
2024-04-27
安全验证
2024-04-27
正在进行安全检测...
2024-04-27
相关推荐
1
第一次洗衣服_小学二年级作文100字
2
公务员面试着装攻略等
3
有关于立夏的古诗句赏析(最新)
4
养鸡饲料配方
5
三种最常用的估值方法及其优缺点分析
6
百家姓全文带拼音)
7
文字控qq空间说说短句-最新范文
8
陋室铭
9
土豆红烧肉的正宗做法
10
治疗牙龈肿疼的消炎药
推荐内容
炫酷潮流男生定位烫发型
故乡在远方
我敬佩的一个人清洁工阿姨作文300字
城南旧事读后感200字
世界上最长最大的蛇是哪种
虎皮鹌鹑蛋的做法
26陋室铭
2018第一个梗“做头发”你明白啥意思吗?
人教版小学数学一年级下册试题全册
每日励志格言