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);
}


版权声明:

相关文章推荐

Oracle中的死锁Dead Lock(二)

Oracle死锁监控和解决   在前文中提到,死锁问题解决方法分为死锁监控和死锁处理。所谓死锁监控就是发现死锁。Oracle中,通过锁之间的连接关系,有自动的监控死锁、解决死锁的机制。但是实际中,...

WARNING (theano.gof.compilelock): Overriding existing lock by dead process '4844' (I am process '390

1、UserWarning: Update your Dense call to the Keras 2 API 2、WARNING (theano.gof.compilelock): Overri...

Notes: Process in Operation System and Dead Lock 操作系统中的进程和死锁问题

进程是CPU一系列动作的抽象。下面这个例子很好地说明了程序和进程的关系[1]: 一个好厨艺的父亲正在为他的女儿制作生日蛋糕。做蛋糕的食谱,就是程序,父亲就是CPU,而做蛋糕的原料(面粉、鸡蛋等)就...

sql server dead lock

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

浅谈Sql 死锁(Dead Lock)

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

【简记】Operating System——Dead Lock

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

Share the experience of how to debug dead lock

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

Compare PostgreSQL and Oracle dead lock detect and transaction

Compare PostgreSQL and Oracle dead lock detect and transaction

[LeetCode]242.Valid Anagram&383. Ransom Note&389. Find the Difference

242.Valid Anagram 383. Ransom Note 389. Find the Difference

关于 Dead Connection Detection, Resource Limits, V$SESSION, V$PROCESS and OS processes ( 601605.1)

Applies to: Oracle Database - Enterprise Edition - Version 8.0.3.0 and later Oracle Net Services ...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:note : find dead lock
举报原因:
原因补充:

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