1. 以原子方式操作一组对象时使用一个锁。
2. 同时访问多个逻辑资源。
必须在代码中的任何地方以完全相同的顺序来获得资源的锁。
3. 不要长时间占用锁。
如果一个锁被长时间占用,那么其他线程可能会进入等待状态,这会影响到应用程序的性能。
我们可以用下面这个技巧来把花在关键段中的时间降至最低。
// 下面的代码会在 WM_SOMEMSG 消息被发送到另一个窗口之前阻止其他线程修改 g_s 的值
SOMESTRUCT g_s;
CRITICAL_SECTION g_cs;
DWORD WINAPI SomeThread(PVOID pvParam)
{
EnterCriticalSection(&g_cs);
// Send a message to a window
SendMessage(hWndSomeWnd,WM_SOMEMSG,&g_s,0);
LeaveCriticalSection(&g_cs);
return 0;
}
我们不可能知道窗口过程(Window procedure)需要多长时间来处理 WM_SOMEMSG 消息,可能只需要几微妙,也可能需要几年。在这段时间内,其他线程都无法得到 g_s 的访问权。把前述代码写成下面这种形式会更好。
SOMESTRUCT g_s;
CRITICAL_SECTION g_cs;
DWORD WINAPI SomeThread(PVOID pvParam)
{
EnterCriticalSection(&g_cs);
SOMESTRUCT sTemp = g_s;
LeaveCriticalSection(&g_cs);
// Send a message to a window
SendMessage(hWndSomeWnd,WM_SOMEMSG,&sTemp,0);
return 0;
}
这个技巧假设窗口过程只需读取结构的“快照”就已经足够了,它同时还假设窗口过程不需要修改结构中的成员。