首页
社区
课程
招聘
[旧帖] 临界区CriticalSection/互斥Mutex释放问题 0.00雪花
发表于: 2012-9-9 20:13 8943

[旧帖] 临界区CriticalSection/互斥Mutex释放问题 0.00雪花

2012-9-9 20:13
8943
最近学习多进程,多线程同步互斥,碰到个问题,就是多个线程使用了临界区.
当一个线程奔溃后,其奔溃地点不好确定,可能刚好在临界区,那么在异常处理代码中该如何去释放这个临界区资源.
__try
{
    code 1
    EnterCriticalSection(&cs); //maybe Enter and Leave is in a function.
    code 2
    LeaveCriticalSection(&cs);
    code 3
}
__exception()
{
     //释放可能的临界区资源
   方法1:LeaveCriticalSection(&cs); //直接调用,万一奔溃的代码是code3,岂不是会乱?
    方法2:DeleteCriticalSection(&cs); //若进入临界区,这样删除会不会有问题?
}


请教一般这种情况下,如何去正确释放临界区资源.还有互斥量Mutex

[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)

收藏
免费 0
支持
分享
最新回复 (14)
雪    币: 126
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
	DWORD dwTid = GetCurrentThreadId();
	if (dwTid == (DWORD)cs_stask_state.OwningThread) //当前线程占用
	{
		//DeleteCriticalSection(&cs_stask_state);
		InitializeCriticalSection(&cs_stask_state); //经测试,直接调用初始化就行
	}

自己想了这么个方法,判断若是当前异常线程占用,就直接再次初始化,因为还需要再次使用该临界区
看这种写法是否符合常规?
2012-9-9 20:56
0
雪    币: 9
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
bool bEnter = false;
__try
{
    code 1
    
    EnterCriticalSection(&cs); //maybe Enter and Leave is in a function.

    bEnter = true;
    code 2
    bEnter = false;

    LeaveCriticalSection(&cs);

    code 3
}
__exception()
{
    if (bEnter)     LeaveCriticalSection(&cs);
}

2012-9-9 21:22
0
雪    币: 2781
活跃值: (2573)
能力值: ( LV6,RANK:80 )
在线值:
发帖
回帖
粉丝
4
TryEnterCriticalSection
2012-9-9 22:31
0
雪    币: 1708
活跃值: (586)
能力值: ( LV15,RANK:670 )
在线值:
发帖
回帖
粉丝
5
可以封装一下。

class CLocalLock
{
public:
CLocalLock(LPCRITICAL_SECTION lpCriticalSection)
        :m_lpCriticalSection(lpCriticalSection){
        EnterCriticalSection(lpCriticalSection);
}

~CLocalLock()
     {
        LeaveCriticalSection(m_lpCriticalSection);
}

private:
        LPCRITICAL_SECTION m_lpCriticalSection;
};

用的时候:
void foo(...)
{
    try {
       .....
       CLocalLock(&cs);
    }
    catch (...) {
        // 来到这里互斥锁已经被自动释放了。
    }

}
2012-9-10 10:22
0
雪    币: 126
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
这个应该可以 :)
2012-9-10 11:10
0
雪    币: 126
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
这个无法判断是哪个线程占用了临界区,也就不好对临界区进行删除或初始化操作.若其它线程占用,若使用初始化,当其它线程释放时,会对临界区的一些计数产生影响.
2012-9-10 11:13
0
雪    币: 126
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
类封装看过去没问题,但实质上跟普通代码一样,线程异常时还是有可能正好处于临界区内运行
2012-9-10 11:14
0
雪    币: 126
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
如果是使用互斥Mutex,该如何解决这个异常释放问题?
2012-9-10 11:15
0
雪    币: 1708
活跃值: (586)
能力值: ( LV15,RANK:670 )
在线值:
发帖
回帖
粉丝
10
我明白你的意思了,类出作用域就会自动析构,你是说类没有构造就被析构的情况???
可以再把类完善一下。
2012-9-10 12:10
0
雪    币: 126
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
在这个类构造函数执行时,由于代码简单,应该没那么容易造成线程奔溃,也就不会出现没构造就被析构的情况.
我之前的评论是我对类出作用域被自动析构没理解好,我以为在try{}块里面完成析构的
谢谢提醒.另外你知道mutex在这种情况下如何去正确释放吗?
2012-9-10 14:23
0
雪    币: 7
活跃值: (333)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
12
推荐使用InitializeCriticalSectionAndSpinCount初始化临界区。
2012-9-10 22:11
0
雪    币: 126
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
13
恩,那个适用于多核
请问mutex怎么解决异常线程或进程导致的资源释放问题?
2012-9-12 00:29
0
雪    币: 69
活跃值: (30)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
14
EnterCriticalSection(&cs)
__try
{
}
__except (...)
{
}
LeaveCriticalSection(&cs);
2012-9-14 17:35
0
雪    币: 219
活跃值: (773)
能力值: (RANK:290 )
在线值:
发帖
回帖
粉丝
15
路过~~~~
2012-9-14 17:48
0
游客
登录 | 注册 方可回帖
返回
//