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


版权声明:

Android JNI DETECTED ERROR IN APPLICATION的解决

在APK中使用了jni 的so shared library,运行的运行的时候出现如下的错误: art F art/runtime/check_jni...
  • sy373466062
  • sy373466062
  • 2016年07月12日 12:58
  • 10907

通过ThreadMXBean类来检查程序中的死锁

转载地址:http://www.importnew.com/15307.html 首先申明一下创建这个分类《技术分享》的原因,本人特别喜欢开源的代码,也非常热衷于别人分享喜欢的代码,看到一些精彩的技术...
  • zdnuist
  • zdnuist
  • 2015年03月17日 20:11
  • 682

避免dead lock的方法

在有些情况下死锁是可以避免的。本文将展示三种用于避免死锁的技术: 加锁顺序加锁时限死锁检测 加锁顺序 当多个线程需要相同的一些锁,但是按照不同的顺序加锁,死锁就很容易发生。 ...
  • SushiPlus
  • SushiPlus
  • 2014年10月13日 10:27
  • 1145

Oracle中的死锁Dead Lock(二)

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

浅谈Sql 死锁(Dead Lock)

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

SQL Server Dead Lock Log

1 . 模拟Dead Lock 开2个session
  • sui84
  • sui84
  • 2014年06月25日 13:54
  • 618

Deep Learning: win7安装Theano,配置GPU

下载安装 AnacondaCE: AnacondaCE我安装在E:\AnacondaCE(去官网下载这个http://www.continuum.io/downloads,这个可是傻瓜式安装,然...
  • chlele0105
  • chlele0105
  • 2014年10月28日 21:58
  • 6652

vsftpd dead , but subsys locked --解除方法汇总(Red Hat Enterprise Linux 4)

系统: RHEL4ftp软件:vsftpd 2.**** , 与 xinetd 分离运行.状态: 执行用service vsftpd status ->vsftpd dead, but subsys ...
  • yunccll
  • yunccll
  • 2006年12月11日 18:05
  • 5438

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...
  • JohinieLi
  • JohinieLi
  • 2017年04月10日 16:29
  • 3069

安装Apache后查看httpd状态出现“httpd dead but subsys locked”问题

这个问题是安装部署Ganglia时遇到的,httpd版本2.2.15,CentOS版本是6.4。 安装方式: yum install httpd安装完成后,启动一切显示正常,但查看httpd状态时...
  • Hadas_Wang
  • Hadas_Wang
  • 2016年06月03日 10:34
  • 4245
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:note : find dead lock
举报原因:
原因补充:

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