WHQL 2017-09-10 05:37 采纳率: 0%
浏览 826

使用事件对象进行线程同步,未能正常输出

#include
#include
#define NUMTHREADS 3
#define BUFFER_SIZE 16
#define FOR_TIMES 5

HANDLE hWriteEvents[NUMTHREADS];
HANDLE hReadEvents[NUMTHREADS];
BYTE lpShareBuffer[16]={0};
void MultiEvents(void);
VOID WaitToBuffer(VOID);
DWORD WINAPI ThreadFunction(LPVOID lpParam);
int main(){
MultiEvents();
}
void MultiEvents(void){
HANDLE hThread;
DWORD i;
for(i=0;i<NUMTHREADS;i++){
hWriteEvents[i]=CreateEvent(NULL,FALSE,FALSE,NULL);
if(hWriteEvents[i]==NULL){
printf("createEvent faild(%d)\n",GetLastError());
return;
}
hReadEvents[i]=CreateEvent(NULL,FALSE,FALSE,NULL);
if(hReadEvents[i]==NULL){
printf("createEvent faild(%d)\n",GetLastError());
return;
}

hThread=CreateThread(NULL,0,ThreadFunction,&i,0,NULL);
if(hThread==NULL){
    printf("CreateThread failed(%d)\n",GetLastError());
    return ;
}
}
WaitToBuffer();

}
VOID WaitToBuffer(VOID){
DWORD dwWaiteResult,j,i;
for(j=0;j<FOR_TIMES;j++){
Sleep(rand()%100);
wsprintfA((LPSTR)lpShareBuffer,"shared%d",j);
for(i=0;j<NUMTHREADS;j++){
if(!SetEvent(hWriteEvents[i])){
printf("setEvent failed(%d)\n",GetLastError());
return;
}
}
dwWaiteResult=WaitForMultipleObjects(NUMTHREADS,hReadEvents,TRUE,INFINITE);//等待所有的线程读完,开始下次写入;
if(dwWaiteResult!=WAIT_OBJECT_0){
printf("Wait error:%d\n",GetLastError());
ExitProcess(0);
}

}

}
DWORD WINAPI ThreadFunction(LPVOID lpParam){
DWORD dwWaitResult;
BYTE lpRead[16];

LPWORD  dwThreadIndex;
dwThreadIndex=(LPWORD)lpParam;
DWORD B=*dwThreadIndex ;
printf("%d",B);
for(DWORD j=0;j<FOR_TIMES;j++){
printf("%d",j);
dwWaitResult=WaitForSingleObject(hWriteEvents[B],INFINITE);
switch(dwWaitResult){
case WAIT_OBJECT_0:
    Sleep(rand()%10);
    CopyMemory(lpRead,lpShareBuffer,16);
        printf("%d",j);
    break;
default:
    printf("Waite error :%d\n",GetLastError());
    ExitThread(0);
}
if(!SetEvent(hReadEvents[B])){
    printf("SetEvent failed (%d)\n",GetLastError());
    return 0;
}

}
return 1;

}

  • 写回答

1条回答

  • threenewbee 2017-09-10 06:10
    关注
    评论

报告相同问题?

悬赏问题

  • ¥15 使用C#,asp.net读取Excel文件并保存到Oracle数据库
  • ¥15 C# datagridview 单元格显示进度及值
  • ¥15 thinkphp6配合social login单点登录问题
  • ¥15 HFSS 中的 H 场图与 MATLAB 中绘制的 B1 场 部分对应不上
  • ¥15 如何在scanpy上做差异基因和通路富集?
  • ¥20 关于#硬件工程#的问题,请各位专家解答!
  • ¥15 关于#matlab#的问题:期望的系统闭环传递函数为G(s)=wn^2/s^2+2¢wn+wn^2阻尼系数¢=0.707,使系统具有较小的超调量
  • ¥15 FLUENT如何实现在堆积颗粒的上表面加载高斯热源
  • ¥30 截图中的mathematics程序转换成matlab
  • ¥15 动力学代码报错,维度不匹配