首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

为何很多人都用CRITICAL_SECTION实现锁

2013-02-24 
为什么很多人都用CRITICAL_SECTION实现锁如题。CRITICAL_SECTION只能用于不同线程的互斥,而不能用于同步。因

为什么很多人都用CRITICAL_SECTION实现锁
如题。CRITICAL_SECTION只能用于不同线程的互斥,而不能用于同步。因为同一个线程可以多次EnterCriticalSection。。   为什么网上的代码,很多“锁”、“自动锁”的类,都是用CRITICAL_SECTION实现。   如果使用的人不熟悉这个,很容易就会用错呀。
[解决办法]
CRITICAL_SECTION本来就是用来
在多线程的情况下 
保证一段代码一次只会被一个线程执行

同一个线程的多次EnterCriticalSection,必然是先后执行的,会有什么问题?
[解决办法]
我是在做windows嵌入式系统的驱动时,看到windows系统内核源码在做对象同步的时候通常都用的CRITICAL_SECTION,而且内核源码中还简单的封装好一个class,后来我就干脆把它保存起来,用于自己的项目中。
[解决办法]


#ifdef _WIN32
        EnterCriticalSection(&m_lock);
#else
        pthread_mutex_lock(&m_lock);
#endif

这种写法真蛋疼
建议搞个公共定义头,头里

#ifdef _WIN32
#define XXX_LOCK(x) EnterCriticalSection(&x);
#else
#define XXX_LOCK(x) pthread_mutex_lock(&x);
#endif

下面就直接XXX_LOCK(m_lock),不用那么多#ifdef,看起来也舒服
[解决办法]
引用:
如题。CRITICAL_SECTION只能用于不同线程的互斥,而不能用于同步。因为同一个线程可以多次EnterCriticalSection。。   为什么网上的代码,很多“锁”、“自动锁”的类,都是用CRITICAL_SECTION实现。   如果使用的人不熟悉这个,很容易就会用错呀。


没错啊,很多时候用CRITICAL_SECTION 实现锁啊。锁的目的不就是对某一个资源的独享式占有。当然你也可以使用Mutex来实现锁。但是CRITICAL_SECTION是非内核对象(用户对象?不知怎么叫),Mutex是内核对象。内核对象的创建、释放、工作会比非内核对象慢,因为微软在实现这套机制时做了很多背后的工作,所以会慢。CRITICAL_SECTION的执行速度会更快,所以大家多数情况下使用CRITICAL_SECTION,除非需要跨进程来进行互斥或者锁才会使用Mutex。
这个链接讲的不错:http://blog.csdn.net/wwl33695/article/details/8349549

热点排行