很多时候多线程环境下你会在不同的线程之间拥有许多窗口,或者多个线程之间通过消息机制通讯,此外,你还用诸如临界区等等互斥体来保护临界数据。在这样的复杂情况,如果不慎在线程之间交叉使用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 lResult = SendMessage(g_hWnd2,WM_SOMEMSG2,0,0);
LeaveCriticalSection(&g_cs);
printf("Message sent to thread 2 and

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

被折叠的 条评论
为什么被折叠?



