爱悠闲 > note : find dead lock

note : find dead lock

分类:  |  作者: lostspeed 相关  |  发布日期 : 2013-07-25  |  热度 : 717°

今天在工程中,加了一个临界区,用于同步队列的操作。

主线程和工作线程中都有受锁保护的队列操作。

投递一个消息A到主线程,由消息处理函数fnA来干活。

在fnA中干完活后,有可能再投递一个消息A到主线程.

开始没处理好加锁和解锁,导致一个临界区会进去1次以上.

临界区在一个线程中是可以重复进入的.

但是投递了消息后,另外一个线程, 再执行有加锁的队列操作,如果锁没有被释放, 就阻塞了..

测试人员在发消息的按钮上又乱点了2次,程序挂了。


锁加的比较琐碎,子函数中也对可能同一把锁加锁, 如果直接看代码,比较烦躁。

在加锁的地方,下了个断点,如果发现在一个线程中释放锁之前重新加锁, 查看调用栈,调整加锁的粒度,  使重新加锁前,已经解锁。

使投递消息之前,能够解锁. 避免在另外一个线程中使用锁操作时,被阻塞住.


/// @file		Lock.h
/// @brief		sample lock

void JobListLockerInit();
void JobListLock();
void JobListUnLock();
void JobListLockerUnInit();

void LockerInit_CriticalSection(CRITICAL_SECTION * pLocker);
void Lock_CriticalSection(CRITICAL_SECTION * pLocker);
void UnLock_CriticalSection(CRITICAL_SECTION * pLocker);
void LockerUnInit_CriticalSection(CRITICAL_SECTION * pLocker);

/// @file		Lock.cpp
/// @brief		...

#include "stdafx.h"
#include "Lock.h"

CRITICAL_SECTION g_crisec_JobList;
LONGLONG	g_llLockRefCnt = 0;

void JobListLockerInit()
{
	LockerInit_CriticalSection(&g_crisec_JobList);
}

void JobListLock()
{
	LONGLONG llRefCnt = 0;

	if (g_llLockRefCnt >= 1)
	{
		/// if dead lock happen, break here, see call stack
		OutputDebugStringW(L"bp\r\n"); ///< debug lock
	}

	llRefCnt = InterlockedIncrement64(&g_llLockRefCnt);

	Lock_CriticalSection(&g_crisec_JobList);
}

void JobListUnLock()
{
	UnLock_CriticalSection(&g_crisec_JobList);
	InterlockedDecrement64(&g_llLockRefCnt);
}

void JobListLockerUnInit()
{
	LockerUnInit_CriticalSection(&g_crisec_JobList);
}

void LockerInit_CriticalSection(CRITICAL_SECTION * pLocker)
{
	if (NULL == pLocker)
		return;

	InitializeCriticalSection(pLocker);
}

void Lock_CriticalSection(CRITICAL_SECTION * pLocker)
{
	if (NULL == pLocker)
		return;

	EnterCriticalSection(pLocker);
}

void UnLock_CriticalSection(CRITICAL_SECTION * pLocker)
{
	if (NULL == pLocker)
		return;

	LeaveCriticalSection(pLocker);
}

void LockerUnInit_CriticalSection(CRITICAL_SECTION * pLocker)
{
	if (NULL == pLocker)
		return;

	DeleteCriticalSection(pLocker);
}


同类文章: