您的位置:首页 > 其它

CRITICAL_SECTION 对性能的影响 VC十年技术群聊天笔记

2009-06-16 10:13 323 查看
阿呆:

我这几天在准备一个文字. 是关于: 烂用CRITICAL_SECTION 对性能的影响问题. 特别是服务器端程序.

也许本群很多人都觉得自己会使用CRITICAL_SECTION 对象. 不错. 这很好.

但我可以坦白的话,你们所有的使用几乎都是在降低性能. 有更好的方法可以少降低性能
而达到使用CRITICAL_SECTION 对象的目的.

很多人在多线程的程序中使用CRITICAL_SECTION对象.
当然在单线程程序中也可以使用CRITICAL_SECTION对象, 只是没有一点效果而已.

问题是: 在多线程的程序中使用CRITICAL_SECTION对象, 性能和单线程程序差不多了.

在线并思考着09:48:03
遇到了,为什么性能低

张鹏-宁波 09:48:04
问题是: 在多线程的程序中使用CRITICAL_SECTION对象, 性能和单线程程序差不多了. ----- 危言耸听 或者言过其实 ?? 这要看怎么用吧

在线并思考着09:48:21
后来改成直接唤醒线程了



本文出自: 阿呆 http://blog.csdn.net/davemin
宣传: VC 十年技术群 30107096 欢迎高手加入,本群只研究VC


阿呆
这是很坏的情况, 但从我见到的很多代码来看. 这种情况非常普篇.

张鹏, 你要去了解这些用法. 并且要去研究为什么这样用. 应该怎么用.

可是我们大多数人只是去了解用法, 学习用法, 自己也这样用法. 不去了解为什么.
更不会自己去研究.

程序人生09:50:26
windows中的临界区应该是速度比较快的同步对象了吧。还有效率更高的吗?

阿呆

程序人生 提到额外一个问题.
其实达到目的,我们还可以使用: 内核对象.

那么我提一个问题, 使用内核对象, 和使用CRITICAL_SECTION 那个性能好.
还是一样? 如果不一样, 差距是多少?

伊人 09:52:11
CRITICAL_SECTION这个要好
程序人生09:52:11
用内核对象反而慢了,增加了内核和用户层的交互吧。

写程序最需要避免的是用户层和内核层的交互。

临界区(Critical Section)是Win32中提供的一种轻量级的同步机制,与互斥(Mutex)和事件(Event)等内核同步对象相比,临界区是完全在用户态维护的,所以仅能在同一进程内供线程同步使用,但也因此无需在使用时进行用户态和核心态之间的切换,工作效率大大高于其它同步机制。
程序人生(46722287) 09:55:18
http://msdn.microsoft.com/zh-cn/magazine/cc164040(en-us).aspx


本文出自: 阿呆 http://blog.csdn.net/davemin
宣传: VC 十年技术群 30107096 欢迎高手加入,本群只研究VC

阿呆 09:53:12

这些问题, 我希望本群的程序员是非常清楚的.
差距在20倍以上. 这是保守估计
总之是差距很大.

我前面说: CRITICAL_SECTION 是单线程.
大家可能不太理解了.
CRITICAL_SECTION 明明是: 临时性只能单线程而已.

阿呆 09:55:59
我举个实例说明我的意思吧.





lock(Critical Section* p)
假定lock 类在构造时EnterCriticalSection
析构时LeaveCriticalSection

funa()
{
lock;
}

funb()
{
lock;
}

请问线程A在调用funa 时,是否线程B可以同时调用funb.
反之呢?

如果不行, 那么为什么要写两个funa和funb, 是否可以合并为一个
func( parameter isInvokeA )
{
}

如果行, 那么funca和funb 中共用的对象, 是否会失去线程临界保护?



阿呆10:06:35
其实, 我们对多线程的程序设计已经动了不少脑筋. 下了很多功夫, 我们的目的是提高性能. 否则我们使用单线程就可以了. 这不能不说是很好的事情.

如前面程序人生的提到的"编程的技巧", 是的,我们也用了很多"编程的技巧".
让很多API可以随时调用.

使用了很多链表, 来存储数据/数据包(比如网络通信中)

阿呆10:07:51
甚至对于每个大功能模块都有了明确的分离, 而使之的调度更加灵活与独立.
但有时候往往是因为我们只使用了一个: CriticalSection对象 而让我们以上做所作的工作全部白费.

阿呆 10:08:09
我想重点提到的不是: CriticalSection对象
而是: 一个CriticalSection对象

阿呆 10:08:30
我们需要研究我们为什么使用一个CriticalSection对象.
而不是使用100个CriticalSection对象?
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: