您的位置:首页 > 其它

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是怎么分配保护的资源的?
是不是只声明一个就保护全部,声明两个就平分要保护的资源呢?

回答:

如果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之间的东西,这东西当然可以是一段变量,也可以是一长串的代码。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: