多线程环境下调用SendMessage交叉发送消息可能导致的死锁问题

在多线程环境中,线程间通过 SendMessage 进行通讯可能会引发死锁。当线程A持有临界区并发送消息给线程B,而线程B同样在临界区内响应消息,可能导致死锁。解决方法是在访问数据后生成副本,解锁后再发送副本,以避免在临界区内使用 SendMessage。
摘要由CSDN通过智能技术生成

很多时候多线程环境下你会在不同的线程之间拥有许多窗口,或者多个线程之间通过消息机制通讯,此外,你还用诸如临界区等等互斥体来保护临界数据。在这样的复杂情况,如果不慎在线程之间交叉使用SendMessage发送消息,就可能导致死锁隐患。

比如下面的一个例子:

线程A对临界区上锁,对数据进行了一个访问之后把结果通过SendMessage发送给线程B然后开锁。

线程B的某个函数中同样对临界区上锁,对数据进行了一些访问后把结果通过SendMessage发送给线程A。


// SendMessageAndDeadlock.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include <Windows.h>
#include <process.h>
#define WM_SOMEMSG1 WM_USER + 5
#define WM_SOMEMSG2 WM_USER + 6
#define WM_START WM_USER + 7
/*
两个线程,每一个线程一个窗口,然后在两个窗口的消息响应函数里彼此互相SendMessage。
看看两个线程是否会死锁。
*/
HWND g_hWnd1 = NULL;
HWND g_hWnd2 = NULL;
CRITICAL_SECTION g_cs;
LRESULT WINAPI WndProc(HWND hWnd,UINT nMsg,WPARAM wParam,LPARAM lParam)
{
	if(nMsg == WM_SOMEMSG1 && hWnd == g_hWnd1)
	{
		EnterCriticalSection(&g_cs);
		LRESULT lResu
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值