总结一下Windows常用的几种线程同步技术。

1.Critical Sections(临界段),源代码中如果有不能由两个或两个以上线程同时执行的部分,可以用临界段来使这部分的代码执行串行化。它只能在一个独立的进程或一个独立的应用程序中使用。使用方法如下:
//在窗体创建中
InitializeCriticalSection(Critical1)
//在窗体销毁中
DeleteCriticalSection(Critical1)
//在线程中
EnterCriticalSection(Critical1)
……保护的代码
LeaveCriticalSection(Critical1)

2.Mutex(互斥对象),是用于串行化访问资源的全局对象。我们首先设置互斥对象,然后访问资源,最后释放互斥对象。在设置互斥对象时,如果另一个线程(或进程)试图设置相同的互斥对象,该线程将会停下来,直到前一个线程(或进程)释放该互斥对象为止。注意它可以由不同应用程序共享。使用方法如下:
//在窗体创建中
hMutex:=CreateMutex(nil,false,nil)
//在窗体销毁中
CloseHandle(hMutex)
//在线程中
WaitForSingleObject(hMutex,INFINITE)
……保护的代码
ReleaseMutex(hMutex)

3.Semaphore(信号量),它与互斥对象相似,但它可以计数。例如可以允许一个给定资源同时同时被三个线程访问。其实Mutex就是最大计数为一的Semaphore。使用方法如下:
//在窗体创建中
hSemaphore:=CreateSemaphore(nil,lInitialCount,lMaximumCount,lpName)
//在窗体销毁中
CloseHandle(hSemaphore)
//在线程中
WaitForSingleObject(hSemaphore,INFINITE)
……保护的代码
ReleaseSemaphore(hSemaphore, lReleaseCount, lpPreviousCount)

4.还可以使用Delphi中的TcriticalSection这个VCL对象,它的定义在Syncobjs.pas中。

当你开发多线程应用时,并且多个线程同时访问一个共享资源或数据时,你需要考虑线程同步的问题了。

详情:http://www.cnblogs.com/enli/archive/2008/06/27/1231340.html

最新文章

  1. 328. Odd Even Linked List
  2. android下拉菜单 spinner 学习
  3. 开发者需要知道的11条HTML5小常识
  4. Intel Edison的那些事:修改Edison的HTTP服务的页面
  5. Gtest打桩函数
  6. XP系统VPN设置
  7. C#和asp.net中链接数据库中 参数的几种传递方法
  8. javascript常用内置对象总结(重要)
  9. Python计算机视觉3:模糊,平滑,去噪
  10. laravel-1 安装.配置
  11. 第一天 Requests库入门
  12. mysql远程连接 Host * is not allowed to connect to this MySQL server
  13. iOSAPP开发项目搭建
  14. JAVA记录-JDBC介绍
  15. hashMap为啥初始化容量为2的次幂
  16. MVC3学习:实现简单的相册管理和图片管理
  17. 【代码笔记】iOS-json文件的使用
  18. 【Unity】2.9 光源(Lights)
  19. Lua中模块初识
  20. Redis-1-Redis的安装

热门文章

  1. OpenGL ES 2.0 摄像机与投影
  2. SVN二次开发——让SVN、TSVN(TortoiseSVN)支持windows的访问控制模型、NTFS ADS(可选数据流、NTFS的安全属性)
  3. oracle RAC调整数据文件大小并移动表到指定的表空间
  4. package.json 的语法解释
  5. iOS高仿城觅-感谢大神分享
  6. [TYVJ] P1023 奶牛的锻炼
  7. BZOJ 1061 志愿者招募
  8. Find out C++ Memory Usage in Code
  9. vijos1781 同余方程
  10. 一个跨域请求的XSS漏洞