Windows中线程间同步的方法.doc

  1. 1、本文档共24页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
Windows中线程间同步的方法

Windows中线程间同步的方法主要有:事件(Event)、临界区(Critical Section)、互斥量(Mutex)和信号灯(Semaphore)。 1)使用事件对象进行线程间同步: 在使用CreateEvent函数创建事件对象时,将bManualReset参数设置为FALSE,然后在需要独占操作的代码前面加上一个WaitForSingleObject函数,后面加上一个SetEvent即可。 由于bManualReset参数为FALSE,这样当某个线程等待到Event后,Event对象的状态马上就变为复位状态,这样其他线程执行到WaitForSingleObject时就全部处于等待中了,当活动的线程操作完毕后,执行SetEvent函数,Event对象的状态才恢复到置位,这样其他等待的线程才会有一个能继续操作。 SetEvent函数原型如下: HANDLE WINAPI CreateEvent( __in_opt LPSECURITY_ATTRIBUTES lpEventAttributes, //安全描述符 __in BOOL bManualReset, //指定事件对象是否需要手动复位 __in BOOL bInitialState, //指定事件对象创建时的初始状态,为TRUE表示初始状态是置位状态; //为FALSE表示初始状态是复位状态 __in_opt LPCTSTR lpName //指定事件对象名称 ); 当一个事件被创建后,程序就可以通过SetEvent和ResetEvent函数来设置事件的状态: BOOL WINAPI SetEvent( __in HANDLE hEvent ); BOOL WINAPI ResetEvent( __in HANDLE hEvent ); 事件对象不仅可以用于一个进程中多线程同步,还可以用于多进程中的线程同步,只要在创建事件对象时指定事件名字,在其他进程中可以使用OpenEvent函数根据名称打开该事件对象进行使用: HANDLE WINAPI OpenEvent( __in DWORD dwDesiredAccess, //对事件对象的访问限制 __in BOOL bInheritHandle, //子进程是否继承该事件句柄 __in LPCTSTR lpName //事件对象的名字 ); 实例代码如下: #include windows.h #include stdio.h #define THREADCOUNT 4 HANDLE ghWriteEvent; HANDLE ghThreads[THREADCOUNT]; DWORD WINAPI ThreadProc(LPVOID); void CreateEventsAndThreads(void) { int i; DWORD dwThreadID; // Create a manual-reset event object. The write thread sets this // object to the nonsignaled state when it finishes writing to a // shared buffer. ghWriteEvent = CreateEvent( NULL, // default security attributes TRUE, // manual-reset event FALSE, // initial state is nonsignaled TEXT(WriteEvent) // object name ); if (ghWriteEvent == NULL) { printf(CreateEvent failed (%d)\n, GetLastError()); return; } // Create multiple threads to read from the buffer. for(i = 0; i THREADCOUNT; i++) { // TODO: More complex scenarios may r

文档评论(0)

xy88118 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档