能力值:
( LV2,RANK:10 )
|
-
-
2 楼
DWORD dwTid = GetCurrentThreadId();
if (dwTid == (DWORD)cs_stask_state.OwningThread) //当前线程占用
{
//DeleteCriticalSection(&cs_stask_state);
InitializeCriticalSection(&cs_stask_state); //经测试,直接调用初始化就行
}
自己想了这么个方法,判断若是当前异常线程占用,就直接再次初始化,因为还需要再次使用该临界区
看这种写法是否符合常规?
|
能力值:
( 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);
}
|
能力值:
( LV6,RANK:80 )
|
-
-
4 楼
TryEnterCriticalSection
|
能力值:
( 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 (...) {
// 来到这里互斥锁已经被自动释放了。
}
}
|
能力值:
( LV2,RANK:10 )
|
-
-
6 楼
这个应该可以 :)
|
能力值:
( LV2,RANK:10 )
|
-
-
7 楼
这个无法判断是哪个线程占用了临界区,也就不好对临界区进行删除或初始化操作.若其它线程占用,若使用初始化,当其它线程释放时,会对临界区的一些计数产生影响.
|
能力值:
( LV2,RANK:10 )
|
-
-
8 楼
类封装看过去没问题,但实质上跟普通代码一样,线程异常时还是有可能正好处于临界区内运行
|
能力值:
( LV2,RANK:10 )
|
-
-
9 楼
如果是使用互斥Mutex,该如何解决这个异常释放问题?
|
能力值:
( LV15,RANK:670 )
|
-
-
10 楼
我明白你的意思了,类出作用域就会自动析构,你是说类没有构造就被析构的情况???
可以再把类完善一下。
|
能力值:
( LV2,RANK:10 )
|
-
-
11 楼
在这个类构造函数执行时,由于代码简单,应该没那么容易造成线程奔溃,也就不会出现没构造就被析构的情况.
我之前的评论是我对类出作用域被自动析构没理解好,我以为在try{}块里面完成析构的
谢谢提醒.另外你知道mutex在这种情况下如何去正确释放吗?
|
能力值:
( LV5,RANK:60 )
|
-
-
12 楼
推荐使用InitializeCriticalSectionAndSpinCount初始化临界区。
|
能力值:
( LV2,RANK:10 )
|
-
-
13 楼
恩,那个适用于多核
请问mutex怎么解决异常线程或进程导致的资源释放问题?
|
能力值:
( LV3,RANK:20 )
|
-
-
14 楼
EnterCriticalSection(&cs)
__try
{
}
__except (...)
{
}
LeaveCriticalSection(&cs);
|
能力值:
(RANK:290 )
|
-
-
15 楼
路过~~~~
|
|
|