锁的使用:一些有用的窍门和技巧

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

这个技巧假设窗口过程只需读取结构的“快照”就已经足够了,它同时还假设窗口过程不需要修改结构中的成员。

posted on 2011-12-30 00:50 梦五 阅读(163) 评论(0)  编辑 收藏 引用 所属分类: Windows相关


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理


<2024年11月>
272829303112
3456789
10111213141516
17181920212223
24252627282930
1234567

导航

统计

常用链接

留言簿

随笔分类

随笔档案

文章分类

文章档案

搜索

最新评论

阅读排行榜

评论排行榜