note : find dead lock

原创 2013年12月03日 00:58:44

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

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

投递一个消息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);
}


版权声明: 举报

相关文章推荐

sql server dead lock

--sql server dead lock (学习与研究) sql server 2008 r2 --http://mahuidong0222.blog.163.com/blog/static/1...

oracle dead lock

死锁的其中一个原因是互相占用已有的资源。 首先,左边执行update hr.departments set department_name='deptname';然后右边执行update hr.em...

精选:深入理解 Docker 内部原理及网络配置

网络绝对是任何系统的核心,对于容器而言也是如此。Docker 作为目前最火的轻量级容器技术,有很多令人称道的功能,如 Docker 的镜像管理。然而,Docker的网络一直以来都比较薄弱,所以我们有必要深入了解Docker的网络知识,以满足更高的网络需求。

【简记】Operating System——Dead Lock

This memo is based on the course of Dr.Li with Operating System as the reference book.本章内容: 死锁的概念 死锁...

浅谈Sql 死锁(Dead Lock)

死锁是指进程之间相互block的,并形成一个block环路导致无unblock的情况。死锁必须发生在两个或更多的进程之间,如果是两个进程的话,那就是进程A block了进程B,而进程B也block了进...

Compare PostgreSQL and Oracle dead lock detect and transaction

Compare PostgreSQL and Oracle dead lock detect and transaction

Share the experience of how to debug dead lock

分享一下最近解的一个死锁的问题。当看到这样一次Crash时,你该怎么去处理呢?相信很多时候,大家都束手无策。怎么办呢? 死锁, dead lock

Python Notes #3 - 1.21.2013

测试 Boehm Curve [图片Boehm_Curve.jpg 来自我的Instagram] 你发现bug的时间越晚,修改它所需付出的代价也就越大,所以尽早捕获到bug将会降低总体时...

Dead Man's Island——5、A Dead Man

I went into the room...and I was very surprised. The room was full of strange things.Coloured shirt...

Python Notes #1 - 1.20.2013

精确引入模块中的函数: from math import sqrt 这样可以精确的引入math模块中的sqrt函数,但是并不建议使用这样的方法。原因是当两个模块含有同名函数时,这样的做法会引起...

C语言中 各种指针定义到对比 联想2014秋笔试题目

今天在联想笔试遇到一个题目,是各种指针地
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)