简单的事件同步,可就是不是我想的这样,可见线程同步是个大难题,大家分析一下
//本程序为什么采用事件同步,写线程和读线程(先写后读,写时不可读,读时不可写)
#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




