- 1、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
线程锁的理解.pdf
多个线程操作相同的数据时,一般是需要按顺序访问的,否则会引导数据错乱,无法控 制数据,变成随机变量。为解决这个问题,就需要引入互斥变量,让每个线程都按顺序地访 问变量。这样就需要使用EnterCriticalSection和LeaveCriticalSection 函数。 补充: 就像上厕所: 门锁了,就等着,等到别人出来了,进去锁上,然后该干什么干什么,干完了,把门打 开 门没锁,就进去,锁上,然后该干什么干什么,干完了,把门打开 多线程中用来确保同一时刻只有一个线程操作被保护的数据 InitializeCriticalSection(cs); //初始化临界区 EnterCriticalSection(cs); //进入临界区 //操作数据 MyMoney*=10; //所有访问MyMoney变量的程序都需要这样写Enter.. Leave... LeaveCriticalSection(cs); //离开临界区 DeleteCriticalSection(cs); //删除临界区 线程锁的概念函数EnterCriticalSection和LeaveCriticalSection的用法 注:使用结构CRITICAL_SECTION 需加入头文件#include “afxmt.h” 定义一个全局的锁 CRITICAL_SECTION 的实例 和一个静态全局变量 1 CRITICAL_SECTION cs;//可以理解为锁定一个资源 2 static int n_AddValue = 0;//定义一个静态的全部变量n_AddValue 创建两个线程函数,代码实现如下: 3 //第一个线程 4 UINTFirstThread(LPVOID lParam) 5 { 6 EnterCriticalSection(cs);//加锁 接下来的代码处理过程中不允许其他线程进 行操作,除非遇到LeaveCriticalSection 7 for(int i = 0; i10; i++) 8 { 9 n_AddValue ++; 1 cout n_AddValue in FirstThread is n_AddValue endl; 1 } 1 LeaveCriticalSection(cs);//解锁 到EnterCriticalSection 之间代码资源已经释 放了,其他线程可以进行操作 1 return 0; 1 1 } 1 1 //第二个线程 1 UINTSecondThread(LPVOID lParam) 1 { 2 EnterCriticalSection(cs);//加锁 2 for(int i = 0; i10; i++){ 2 n_AddValue ++; 2 cout n_AddValue in SecondThread is n_AddValue endl; 2 2 } 2 LeaveCriticalSection(cs);//解锁 2 2 return 0; 2 3 } 在主函数添加以下代码 3 int _tmain(int argc,TCHAR* argv[], TCHAR* envp[]) 3 { 3 int nRetCode = 0; 3 3 // 初始化 MFC 并在失败时显示错误 3 if(!AfxWinInit(::GetModuleHandle(NULL), NULL, ::GetCommandLine(), 0)) 3 { 3 // TODO: 更改错误代码以符合您的需要 3 _t
文档评论(0)