导航
  • 主页
  • VC综合技术
  • 互联网技术
  • MFC AppLauncher
  • .NET 技术
  • 界面
  • 进程
  • 算法
  • 硬件/系统
  • 数据库
  • VC++技术资源

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

chsilence 中建材集团进出口公司 CTO/CIO/技术副总裁/总工程师  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);
}
...全文
149 点赞 收藏 5
写回复
5 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
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被加锁了,程序就会在这一步等待,直到被解锁。
回复
发动态
发帖子
VC/MFC
创建于2007-09-28

1.5w+

社区成员

VC/MFC相关问题讨论
申请成为版主
社区公告

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