很多时候多线程环境下你会在不同的线程之间拥有许多窗口,或者多个线程之间通过消息机制通讯,此外,你还用诸如临界区等等互斥体来保护临界数据。在这样的复杂情况,如果不慎在线程之间交叉使用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