网站大量收购独家精品文档,联系QQ:2885784924

线程同步,多线程.doc

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

多线程-线程间同步 【】nTickets - -语句时,线程1的时间片刚好用完了,线程2得到运行权,但此时nTickets还是30号,于是售出30号票。这样就出现了一票多售的情况。因此,多线程编程有时需要处理同步问题。 我们必须多线程竞争状态的同步问题。 为解决此类问题,必须引入同步处理机制。常用的同步处理机制包括临界区、互斥量、信号量、事件4种方式: 临界区 临界区是一段连续的代码区域,它要求在执行前获得对某些共享数据的独占的访问权。如果一个进程中的所有线程中访问这些共享数据的代码都放在临界区中,就能够实现对该共享数据的同步访问。临界区只能用于同步单个进程中的线程。 使用前调用InitializeCriticalSection,使用完毕调用DeleteCriticalSection;进入保护代码前调用EnterCriticalSection,离开保护代码时调用LeaveCriticalSection。 我们修改的代码如下: int nTickets; HANDLE hThread1; HANDLE hThread2; //实例化临界区对象 CRITICAL_SECTION g_sec; DWORD WINAPI ThreadProc1(LPVOID lpParameter) { CTestDlg *pDlg = (CTestDlg *)lpParameter; CString CurStr=; while (TRUE) { //进入临界区,临界区对象的引用计数加1,同一个线程可以多次调用 //EnterCriticalSection,但是如果调用n次EnterCriticalSection以后, //必须再调用n次的LeaveCriticalSection,使临界区对象的引用计数变为0, //其它的线程才能进入临界区 EnterCriticalSection(g_sec); if (nTickets 0) { Sleep(100); CString str; str.Format(%d, nTickets); CurStr+=str+\r\n; pDlg-SetDlgItemText(IDC_EDIT1,CurStr); nTickets--; //离开临界区 LeaveCriticalSection(g_sec); if (nTickets==0) break; } } return 0; } DWORD WINAPI ThreadProc2(LPVOID lpParameter) { CTestDlg *pDlg = (CTestDlg *)lpParameter; CString CurStr=; while (TRUE) { EnterCriticalSection(g_sec); if (nTickets 0) { Sleep(100); CString str; str.Format(%d, nTickets); CurStr+=str+\r\n; pDlg-SetDlgItemText(IDC_EDIT2,CurStr); nTickets--; //离开临界区 LeaveCriticalSection(g_sec); if (nTickets==0) break; } } return 0; } void CTestDlg::OnButton1() { nTickets = 30; //初始化临界区对象 InitializeCriticalSection(g_sec); hThread1 = ::CreateThread(NULL, 0, ThreadProc1, this, 0, NULL); hThread2 = ::CreateThread(NULL, 0, ThreadProc2, this, 0, NULL); //释放临界区对象 //DeleteCriticalSection(g_sec); 放入析构函数去释放临界区对象 ::CloseHandle(hThread1); //清除线程内核对象 ::CloseHandle(hThread2); } 互斥量 相关函数有CreateMutex,ReleaseMutex,WaitForSingleObject等。在调用CreateMutex 函数的时候Windows则创建了互斥量内核对象。 创建互斥量 HANDLE CreateMutex( LPSECURITY_ATTRIBUTES lpMutexAttributes, BOOL bInitial

文档评论(0)

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

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

1亿VIP精品文档

相关文档