CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
可用分押宝游戏火热进行中... 专题改版:Java Web 专题
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  VC/MFC >  进程/线程/DLL

简单的事件同步,可就是不是我想的这样,可见线程同步是个大难题,大家分析一下

楼主wzswgbx(我总是问个不休)2003-08-01 16:51:19 在 VC/MFC / 进程/线程/DLL 提问

//本程序为什么采用事件同步,写线程和读线程(先写后读,写时不可读,读时不可写)  
  #include   "stdafx.h"  
   
  #include   "windows.h"  
  #include   "process.h"  
  #include   "iostream.h"  
   
  HANDLE   hWriteEvent;  
  HANDLE   hReadEvent[2];  
  HANDLE   hRead;  
   
  CRITICAL_SECTION   section;  
  BOOL   bRunning=TRUE;  
  int   GlobalBuff[5];  
   
   
   
   
  unsigned   long   _stdcall   WriteThread(LPVOID   lpParam)  
  {  
  hWriteEvent=CreateEvent(NULL,FALSE,FALSE,NULL);//自动事件,无信号  
  int   k=1;  
  while(bRunning)  
  {  
  WaitForSingleObject(hRead,INFINITE);  
  {  
  for(int   i=0;   i<5;   i++)  
  GlobalBuff[i]=(i+1)*k;  
  k++;  
  SetEvent(hWriteEvent);  
  }  
  }  
  return   1;  
  }  
   
  unsigned   long   _stdcall   ReadThread1(LPVOID   lpParam)  
  {  
  hRead=CreateEvent(NULL,FALSE,TRUE,NULL);  
  while(bRunning)  
  {  
  WaitForSingleObject(hWriteEvent,INFINITE);  
  cout<<"Print   from   Thread   #1:";  
  for(int   i=0;   i<5   ;i++)  
  cout<<GlobalBuff[i]<<"           ";  
  cout<<endl;  
  SetEvent(hRead);  
  }  
  return   1;  
  }  
   
   
   
  int   main(int   argc,   char*   argv[])  
  {  
   
  HANDLE   handle1,handle2;  
  DWORD   dw1,dw2;  
   
   
  handle1=CreateThread(NULL,0,WriteThread,NULL,0,&dw1);  
  handle2=CreateThread(NULL,0,ReadThread1,NULL,0,&dw2);  
  Sleep(1000);  
   
  CloseHandle(handle1);  
  CloseHandle(handle2);  
  CloseHandle(hWriteEvent);  
   
  return   0;  
  }  
  这么简单,但就是得不出正确答案  
  我的思路是:  
  运行线程WriteThread  
  1.因得不到hRead信号,就停在这里:  
  WaitForSingleObject(hRead,INFINITE);  
  运行线程readThread1  
  2.激活信号hRead,并停在这里  
  WaitForSingleObject(hWriteEvent,INFINITE);  
   
  线程WriteThread得到hRead信号后并使hRead无信号,写入数据,激活hWriteEvent  
  重新回到1.  
  线程readThread1得到hWriteEvent信号并使WriteEvent无信号,打印出数据,激活hRead,重新加到2.  
  大家说对不对?  
   
   
  问题点数:0、回复次数:7Top

1 楼afc(afc)回复于 2003-08-01 22:12:25 得分 0

1.   Event应该在main中创建,不一定先创建的线程就先执行,并且可能出现等待的时候Event还没有被另一个线程创建的问题。  
  2.   线程死锁,WriteThread在等hRead之后才能设置hWriteEvent,而readThread必须等到hWriteEvent才能设置hRead,两个线程互相锁定,都没有机会得到需要的事件Top

2 楼wzswgbx(我总是问个不休)回复于 2003-08-01 22:34:20 得分 0

好象并没有死锁,我还能打印出一些数据来,只是不是我要的  
  不在main中创建是因为要先写再读,如果在main中创建是不能达到这一点的Top

3 楼afc(afc)回复于 2003-08-01 23:02:16 得分 0

可能是WaitForSingleObject调用失败,你没有判断返回值  
  if   (WAIT_OBJECT_0   ==   WaitForSingleObject(.....))   {  
          ...;  
  }  
   
  有看了一下程序,你的hRead是在CreateEvent的时候设置Event为有信号,这样是不会造成死锁问题,但是还是上边说的,可能Event还没有创建另外一个线程就在等待了,这时WaitForSingleObject返回的是一个错误值Top

4 楼wzswgbx(我总是问个不休)回复于 2003-08-01 23:04:10 得分 0

我在  
  handle1=CreateThread(NULL,0,WriteThread,NULL,0,&dw1);  
  for(int   i=0;i<10000;i++)   ;  
  handle2=CreateThread(NULL,0,ReadThread1,NULL,0,&dw2);  
  结果也不正常Top

5 楼wzswgbx(我总是问个不休)回复于 2003-08-01 23:06:32 得分 0

谢,在你的指导下,加入WAIT_OBJECT_0,搞定Top

6 楼tanglg00(唐立刚)回复于 2003-08-14 11:03:10 得分 0

为什么不用一个线程来完成读/写的功能呢?????!Top

7 楼duyhui(一天到晚游泳的鱼)回复于 2003-08-19 10:34:37 得分 0

CreateEvent();是创建事件  
  WaitForSingleObject();是等待事件的信号如果返回的是WAIT_OBJECT_0的话就是有信号  
  SetEvent()是使事件有信号  
  ResetEvent()是使事件无信号  
   
  知道这些做个简单的线程同步是没问题的!Top

相关问题

  • 线程难题
  • 工作者线程难题!!!
  • 怎样在主线程中得到线程终止事件???
  • Dll、多线程、事件传递
  • 关于多线程的事件问题?
  • 用事件同步线程的问题?
  • 多线程触发事件的问题
  • 100分再问一个关于线程的难题
  • 多线程同步的难题, 大虾请进.
  • 控件的多线程处理难题,请帮忙呀

关键词

  • 线程
  • null
  • hwriteevent
  • 事件
  • brunning
  • hread
  • handle
  • section
  • 时不可
  • include

得分解答快速导航

  • 帖主:wzswgbx

相关链接

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

广告也精彩

反馈

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