CRITICAL_SECTION结构与共享资源绑定的问题
2008-03-05 19:13
295 查看
一个CRITICAL_SECTION结构是与某个共享资源绑定的吗?
int Num
CRITICAL_SECTION g_Num
int ID
CRITICAL_SECTION g_ID
这样就可以实现g_Num保护Num,g_ID保护 ID吗?没有进行任何绑定工作呀?难道只要将CRITICAL_SECTION写在要保护的资源后面吗?
int Num
int ID
CRITICAL_SECTION g_ALL
这样g_ALL就可以保护Num和ID。
不知道CRITICAL_SECTION是怎么分配保护的资源的?
是不是只声明一个就保护全部,声明两个就平分要保护的资源呢?
int Num
CRITICAL_SECTION g_Num
int ID
CRITICAL_SECTION g_ID
就可以保证g_Num保护Num,而g_ID保护ID,而不是g_Num保护ID。。。
没有调用什么函数将他们关联起来啊。。。。。
int Num
CRITICAL_SECTION g_Num
int ID
CRITICAL_SECTION g_ID
这样是没有用的,你还需要在需要保护全局变量的时候进行某些动作:
EnterCriticalSection( &g_Num );
/* access Num */
LeaveCriticalSection( &g_Num );
EnterCriticalSection( &g_ID );
/* access ID */
LeaveCriticalSection( &g_Num );
实际步骤是
(1)定义(1次)
CRITICAL_SECTION gCS;
(2)初始化(1次)
InitializeCriticalSection(&gCS);
(3)需要操作保护内容的时候,自己调用锁定(多处可用)
EnterCriticalSection(&gCS);
(4)保护操作完毕,解锁定(与3配对,不可嵌套)
LeaveCriticalSection(&gCS);
(5)不再使用,删除(1次)
DeleteCriticalSection(&gCS);
如果是MFC, 你可以用 CCriticalSection
用Lock / UnLock代替上面的 EnterCriticalSection / LeaveCriticalSection
当程序执行到某个EnterCriticalSection时,系统就给这个临界区上了把锁
在其他线程再执行到这个临界区的EnterCtiticalSection的时候,就要等待锁的打开
然后回到之前第一个线程,当它退出临界区(LeaveCriticalSection)的时候,就把锁打开了
既而其他等待中的线程才能进去。
这就象一个厕所,你不知道人进去了是要干什么,但是它只是提供了一个保护而已,他可以进去吸烟,也可以进去干其他的~但是门口有一把锁,只有它被锁上了,里面的人才安全。也只有它出来(开锁)别人才能进去。
临界区保护的不一定是一个变量或者一个具体的结构,它只是一把锁,锁住了(可以这样去理解,实际上,并没有对代码本身附加任何东西)在EnterCriticalSection和LeaveCriticalSection之间的东西,这东西当然可以是一段变量,也可以是一长串的代码。
int Num
CRITICAL_SECTION g_Num
int ID
CRITICAL_SECTION g_ID
这样就可以实现g_Num保护Num,g_ID保护 ID吗?没有进行任何绑定工作呀?难道只要将CRITICAL_SECTION写在要保护的资源后面吗?
int Num
int ID
CRITICAL_SECTION g_ALL
这样g_ALL就可以保护Num和ID。
不知道CRITICAL_SECTION是怎么分配保护的资源的?
是不是只声明一个就保护全部,声明两个就平分要保护的资源呢?
回答:
如果Num和ID之间没有任何关联的话,当然可以使用两个CRITICAL_SECTION来分别保护。Num和g_Num之间的关联就是,访问Num的代码必须用Enter/Leave CRITICAL_SECTION 宏包括起来。意思是这两段代码(也可能是同一段代码在不同的线程内)不会在两个线程内同时执行。回答:
我的意思是为什么这样写int Num
CRITICAL_SECTION g_Num
int ID
CRITICAL_SECTION g_ID
就可以保证g_Num保护Num,而g_ID保护ID,而不是g_Num保护ID。。。
没有调用什么函数将他们关联起来啊。。。。。
回答:
只是int Num
CRITICAL_SECTION g_Num
int ID
CRITICAL_SECTION g_ID
这样是没有用的,你还需要在需要保护全局变量的时候进行某些动作:
EnterCriticalSection( &g_Num );
/* access Num */
LeaveCriticalSection( &g_Num );
EnterCriticalSection( &g_ID );
/* access ID */
LeaveCriticalSection( &g_Num );
回答:
并非定义了CRITICAL_SECTION的变量就能自动实现保护.实际步骤是
(1)定义(1次)
CRITICAL_SECTION gCS;
(2)初始化(1次)
InitializeCriticalSection(&gCS);
(3)需要操作保护内容的时候,自己调用锁定(多处可用)
EnterCriticalSection(&gCS);
(4)保护操作完毕,解锁定(与3配对,不可嵌套)
LeaveCriticalSection(&gCS);
(5)不再使用,删除(1次)
DeleteCriticalSection(&gCS);
如果是MFC, 你可以用 CCriticalSection
用Lock / UnLock代替上面的 EnterCriticalSection / LeaveCriticalSection
回答:
临界区并不会和你所说的东西绑定的,你可以这么去思考当程序执行到某个EnterCriticalSection时,系统就给这个临界区上了把锁
在其他线程再执行到这个临界区的EnterCtiticalSection的时候,就要等待锁的打开
然后回到之前第一个线程,当它退出临界区(LeaveCriticalSection)的时候,就把锁打开了
既而其他等待中的线程才能进去。
这就象一个厕所,你不知道人进去了是要干什么,但是它只是提供了一个保护而已,他可以进去吸烟,也可以进去干其他的~但是门口有一把锁,只有它被锁上了,里面的人才安全。也只有它出来(开锁)别人才能进去。
临界区保护的不一定是一个变量或者一个具体的结构,它只是一把锁,锁住了(可以这样去理解,实际上,并没有对代码本身附加任何东西)在EnterCriticalSection和LeaveCriticalSection之间的东西,这东西当然可以是一段变量,也可以是一长串的代码。
相关文章推荐
- 使用临界区CRITICAL_SECTION结构对象保护多线程互斥地访问共享资源
- 多线程Thread类和Runnable接口资源共享问题分析
- 多线程实现资源共享的问题学习与总结
- sivlerlight绑定资源Resx文件里的字符串问题
- 转载一篇觉得不错的文章,关于并发访问资源共享问题
- 跨域资源共享CORS以及在zepto中使用遇到的问题
- eclipse+tomcat发布由maven构成的web项目lib资源共享问题
- 电脑小白win7wifi共享热点设置,包括无法启动承载网络组或资源出问题,共享出问题,设备出问题等的解决方案
- 多线程实现资源共享的问题学习与总结
- 多线程实现资源共享的问题学习与总结
- CORS(跨域资源共享)跨域问题及解决
- 今天上班在资源丰富共享问题上有收获让我增加底气
- 多线程共享资源问题演示
- 关于Ubuntu16利用网上资源始终加载不了共享库的问题
- win7 共享的问题,"您可能没有权限使用网络资源"的解决办法
- 共享内存结构与指针问题
- 解决ajax跨域请求的问题-cors(资源共享方案)
- java笔记:熟练掌握线程技术---基础篇之解决资源共享的问题(中)--前篇
- Python中线程资源共享的问题
- 多线程实现资源共享的问题学习与总结