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 有人知道怎么将自己的迁移策略布到edgecloudsim上使用吗?
  • ¥15 错误 LNK2001 无法解析的外部符号
  • ¥50 安装pyaudiokits失败
  • ¥15 计组这些题应该咋做呀
  • ¥60 更换迈创SOL6M4AE卡的时候,驱动要重新装才能使用,怎么解决?
  • ¥15 让node服务器有自动加载文件的功能
  • ¥15 jmeter脚本回放有的是对的有的是错的
  • ¥15 r语言蛋白组学相关问题
  • ¥15 Python时间序列如何拟合疏系数模型
  • ¥15 求学软件的前人们指明方向🥺