在线急问一个线程同步问题

chsilence 2004-07-02 02:56:03
请问各位,下面的程序怎么执行有问题,线程函数有时被执行,有时不被执行,为什么呀?快崩溃了!急!

#include<stdio.h>
#include<windows.h>

HANDLE hEvent;
int i = 1;
char g_cArray[10];
DWORD threadProc2(LPVOID lparam)
{

WaitForSingleObject(hEvent,INFINITE);
printf("%d\n",i);

SetEvent(hEvent);
return 0;
}
DWORD threadProc1(LPVOID lparam)
{

WaitForSingleObject(hEvent,INFINITE);
i++;
printf("e%d\n",i);

SetEvent(hEvent);
return 0;
}

void main(void)
{

hEvent = CreateEvent(NULL,false,false,NULL);

HANDLE hThread1 = CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)&threadProc1,NULL,0,NULL);
HANDLE hThread2 = CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)&threadProc2,NULL,0,NULL);


SetEvent(hEvent);

printf("%d\n",i);

CloseHandle(hThread1);
CloseHandle(hThread2);
CloseHandle(hEvent);
}
...全文
179 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
yst_killed 2004-07-06
  • 打赏
  • 举报
回复
void main(void)
{

hEvent = CreateEvent(NULL,false,false,NULL);

HANDLE hThread1 = CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)&threadProc1,NULL,0,NULL);
HANDLE hThread2 = CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)&threadProc2,NULL,0,NULL);


SetEvent(hEvent);
WaitForSingleObject( hThrds[slot] , INFINITE );
//你可以在这里加上这句当然参数可能部队用WaitForSingleObject比较合适
printf("%d\n",i);

CloseHandle(hThread1);
CloseHandle(hThread2);
CloseHandle(hEvent);
}
枫舞的季节 2004-07-02
  • 打赏
  • 举报
回复
我觉得你使用的event 是非手动reset模式的,当你的一个线程结束以后,会被系统自动reset
那么另外的一个线程就会等待,永远的等待。
把这个事件更改为 手动reset模式就可以了。hEvent = CreateEvent(NULL,true,false,NULL);


void main(void)
{

hEvent = CreateEvent(NULL,true,false,NULL);

HANDLE hThread1 = CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)&threadProc1,NULL,0,NULL);
HANDLE hThread2 = CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)&threadProc2,NULL,0,NULL);


SetEvent(hEvent);

printf("%d\n",i);

CloseHandle(hThread1);
CloseHandle(hThread2);
CloseHandle(hEvent);
}
sdwalnut1 2004-07-02
  • 打赏
  • 举报
回复
hEvent可能与别的程序相同,导致线程中waitforsingleobject后面的代码不被执行,而线成就被close了。可以给hevent给一个名称,并且在close之前,先sleep以下
needways 2004-07-02
  • 打赏
  • 举报
回复
void main(void)
{

hEvent = CreateEvent(NULL,false,false,NULL);

HANDLE hThread1 = CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)&threadProc1,NULL,0,NULL);
HANDLE hThread2 = CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)&threadProc2,NULL,0,NULL);


SetEvent(hEvent);

Sleep(3000); // 等待一段时间,不要这么快就关闭句柄。

printf("%d\n",i);

CloseHandle(hThread1);
CloseHandle(hThread2);
CloseHandle(hEvent);
}
sdwalnut1 2004-07-02
  • 打赏
  • 举报
回复
WaitForSingleObject(hEvent,INFINITE)的原因;INFINITE表示一直等待。如果hEvent被加锁了,程序就会在这一步等待,直到被解锁。

16,472

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧