CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
山寨机中的战斗机! 程序优化工程师到底对IT界有没有贡献
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  VC/MFC >  进程/线程/DLL

多线程问题!

楼主ookaiii(IUnknown* pIWorld)2000-11-30 00:10:00 在 VC/MFC / 进程/线程/DLL 提问

 
          2。各位能否告知CMultiLock,CSingleLock,CSyncObject,CEvent,CMutex,CCriticalSection,CSemaphore  
  之间是什么关系,每个类都是干什么用的,怎么使用?(请详细说明,MSDN我看的头都大,还是不明白),  
                 
          3.如果我要锁定某个临界变量num,使它仅供某个线程使用,不被其他线程干扰,  
                          int   num=0;    
                          CCriticalSection   cs;  
                          CSingleLock   sl(&cs);  
                               
                          UINT   OnPro(LPVOID   lp)  
                          {  
                              sl.Lock();  
                              num=400;    
                              Sleep(4000);  
                              sl.UnLock();    
                              PostMessage((HWND)lp,   WM_THREADEND,0,0);  
                              return   0;  
                            }  
   
                        void   CCriticalDlg::OnButton1()    
                        {  
                              AfxBeginThread(OnPro,GetSafeHwnd(),THREAD_PRIORITY_NORMAL);  
                        }  
                        当该进程运行时,我为何还可以在别的进程中改变num的值?应该怎么锁定num?  
                           
                       
  问题点数:100、回复次数:4Top

1 楼singlerace(独行者)回复于 2000-11-30 00:21:00 得分 20

CCriticalSection   cs应该定义为全局的吧。在别的线程访问num时也应该加锁:  
  sl.Lock();  
  //   ...  
  sl.Unlock();Top

2 楼leer(白痴)回复于 2000-11-30 00:36:00 得分 20

第一个问题太大了,我还是来回答你第二个部题吧。  
  sl.Lock();  
  num=400;    
  Sleep(4000);  
  sl.UnLock();  
  这段代码的意思是说在sl.Lock()与sl.UnLoick()之间不允许对num进行修改。  
  只要调用了sl.UnLock()别的线程就可以进行修改了。如果你一定要试可以把sleep的时间  
  加长一些例如一分钟(60000)然后再做一下测试。Top

3 楼abentu()回复于 2000-11-30 08:47:00 得分 50

简单说,所谓的加锁,其实是一种约定,在访问敏感的共享资源时,首先要申请加锁,如果不成功,Lock函数不返回,线程也暂时失去被调度的权利,不被分配CPU时间,直到其它使用者调用Unlock,你的Lock函数才返回,线程才可重新被调度。如果有人不遵守协议,一切都白干Top

4 楼panda_w(好想睡啊!)回复于 2001-01-10 10:14:00 得分 10

第一个问题你还是看看相关的书籍吧。  
  对于第二个问题:  
      你的Sleep导致这个线程碑挂起,所以别的线程可以访问num变量了。  
      你可以使用Interlocked函数族来防止其它的线程访问num,  
      比如InterlockedIncrement((long*)&num);函数。Top

相关问题

  • 多线程啊多线程
  • 多线程socket!!!
  • 多线程
  • 多线程
  • 多线程
  • 多线程
  • CSocket 多线程
  • java多线程
  • 多线程
  • opengl 多线程?

关键词

  • 线程
  • 函数
  • sleep
  • sl
  • 加锁
  • ccriticalsection
  • unlock
  • num
  • 访问
  • lock

得分解答快速导航

  • 帖主:ookaiii
  • singlerace
  • leer
  • abentu
  • panda_w

相关链接

  • Visual C++类图书
  • Visual C++类源码下载

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
北京创新乐知广告有限公司 版权所有, 京 ICP 证 070598 号
世纪乐知(北京)网络技术有限公司 提供技术支持
Copyright © 2000-2008, CSDN.NET, All Rights Reserved
GongshangLogo