c++windows编程:关于线程已经ResetEvent(tHandle);了,为什么WaitForSingleObject下面的代码还能执行呢

jinianjun 2012-03-19 11:54:33
#include <windows.h>
#include <process.h>
#include <iostream>
using namespace std;

long g_iData = 0; // 全局变量

// 线程体
unsigned int __stdcall ThreadFunc(void* param)
{
g_iData++;
//InterlockedExchangeAdd(&g_iData,155);
return 0;
}

unsigned int __stdcall ThreadFunc2(void* param)
{
g_iData=g_iData+3;

//InterlockedExchange(&g_iData, 4);
return 0;
}

void main()
{
unsigned int tid1 = 0;
unsigned int tid2 = 0;
HANDLE tHandle = NULL;
HANDLE tHandle2 = NULL;



tHandle= (HANDLE)_beginthreadex(NULL, 0,
ThreadFunc, 0, 0, &tid1);

ResetEvent(tHandle);
WaitForSingleObject(tHandle, INFINITE);//不等待线程1结束的话,可能会有下面的输出语句先执行而输出1

cout<<g_iData<<endl;
cout<<g_iData<<endl;


tHandle2 = (HANDLE)_beginthreadex(NULL, 0,
ThreadFunc2, 0, 0, &tid2);
cout<<g_iData<<endl;
system("pause");
}

如图里:
明明已经ResetEvent(tHandle);了,为什么WaitForSingleObject(tHandle, INFINITE);下面的代码还能执行呢。
跪求高人指点!!!
...全文
366 26 打赏 收藏 转发到动态 举报
写回复
用AI写文章
26 条回复
切换为时间正序
请发表友善的回复…
发表回复
jinianjun 2012-03-20
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 dahaii0 的回复:]
你使用函数都不看这个函数是什么功能,需要什么参数的吗。
ResetEvent:This function sets the state of the specified event object to nonsignaled.
你传个线程句柄是无效的,虽然都是句柄,但分属不同内核对象,内部实现也不同,不能这么混用,所以GetLastError返回6,意思是 the handle is inva……
[/Quote]
我可以这么理解吗?HANDLE Event = ::CreateEvent(NULL, FALSE, FALSE, NULL); 这里创建的事件的句柄唯一的作用就是为了线程间调度waitforsingleobject函数提供一个参数,也就是一个标识符
jinianjun 2012-03-20
  • 打赏
  • 举报
回复
好的,问题已经解决,感谢各位,结贴!
patrick_880520 2012-03-20
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 jinianjun 的回复:]
我想建立一个CEvent g_event;

可是提示CEvent 是未定义的标识符,怎么办啊?
另外,小弟实在新手,可以给个实例吗?
[/Quote]
加上#include <afxmt.h>
patrick_880520 2012-03-20
  • 打赏
  • 举报
回复
你还是网上搜索下使用waitforsingleobject的例子吧,看例子比较直观
jinianjun 2012-03-20
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 dahaii0 的回复:]
你使用函数都不看这个函数是什么功能,需要什么参数的吗。
ResetEvent:This function sets the state of the specified event object to nonsignaled.
你传个线程句柄是无效的,虽然都是句柄,但分属不同内核对象,内部实现也不同,不能这么混用,所以GetLastError返回6,意思是 the handle is inva……
[/Quote]
小弟新手,可以给个实例吗?
jinianjun 2012-03-20
  • 打赏
  • 举报
回复
我想建立一个CEvent g_event;

可是提示CEvent 是未定义的标识符,怎么办啊?
另外,小弟实在新手,可以给个实例吗?
dahaiI0 2012-03-20
  • 打赏
  • 举报
回复
你使用函数都不看这个函数是什么功能,需要什么参数的吗。
ResetEvent:This function sets the state of the specified event object to nonsignaled.
你传个线程句柄是无效的,虽然都是句柄,但分属不同内核对象,内部实现也不同,不能这么混用,所以GetLastError返回6,意思是 the handle is invalid,再者,创建的event是无信号的,reset下眉什么意义
jinianjun 2012-03-20
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 patrick_880520 的回复:]
beginthread返回线程句柄,waitforsingleobject需要的是event的句柄
[/Quote]
大哥可以详细的说一下吗?
jinianjun 2012-03-20
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 patrick_880520 的回复:]
tHandle不是event的句柄,要createevent
[/Quote]
我用了createevent修改了以后,用int a=GetLastError();返回,调试发现a=6;还是执行了WaitForSingleObject下面的代码
#include <windows.h>
#include <process.h>
#include <iostream>
using namespace std;

long g_iData = 0; // 全局变量

// 线程体
unsigned int __stdcall ThreadFunc(void* param)
{
//Sleep(100);
g_iData++;
//InterlockedExchangeAdd(&g_iData,155);
return 0;
}

unsigned int __stdcall ThreadFunc2(void* param)
{
g_iData=g_iData+3;

//InterlockedExchange(&g_iData, 4);
return 0;
}

void main()
{
unsigned int tid1 = 0;
unsigned int tid2 = 0;

HANDLE tHandle = ::CreateEvent(NULL, FALSE, FALSE, NULL);
HANDLE tHandle2 = ::CreateEvent(NULL, FALSE, FALSE, NULL);



tHandle= (HANDLE)_beginthreadex(NULL, 0,
ThreadFunc, 0, 0, &tid1);
ResetEvent(tHandle);
WaitForSingleObject(tHandle, INFINITE);
int a=GetLastError();

cout<<g_iData<<endl;
cout<<g_iData<<endl;


tHandle2 = (HANDLE)_beginthreadex(NULL, 0,
ThreadFunc2, 0, 0, &tid2);
cout<<g_iData<<endl;
system("pause");
}
patrick_880520 2012-03-20
  • 打赏
  • 举报
回复
beginthread返回线程句柄,waitforsingleobject需要的是event的句柄
oniisama 2012-03-20
  • 打赏
  • 举报
回复
我看错了,我以为LZ要等待一个event,原来LZ想等待线程结束。

LZ先去好好看看msdn吧
不是event的句柄传给ResetEvent没什么作用,而且不明白LZ这里用ResetEvent的意图
jinianjun 2012-03-20
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 patrick_880520 的回复:]
tHandle不是event的句柄,要createevent
[/Quote]beginthreadex也可以的,返回的也是句柄。而且尽量要使用beginthreadex
patrick_880520 2012-03-20
  • 打赏
  • 举报
回复
tHandle不是event的句柄,要createevent
letmegocc 2012-03-20
  • 打赏
  • 举报
回复
geterror一把,看看是什么错误,然后再到网上搜一把就可以
bihackers 2012-03-20
  • 打赏
  • 举报
回复
楼主没弄清事件同步的用法啊
  • 打赏
  • 举报
回复
[Quote=引用 21 楼 bigwatercar 的回复:]
主要是你等待的时候线程都已经执行完了,所以已经有信号了。 你可以在你的线程例程中增加Sleep,看看效果。

上边有人说不是event句柄,说法已经不适合新版本了,具体哪个版本忘记了,msdn有。 请不要误导楼主。
[/Quote]

我把LZ误导了,不好意思。 上边看错了,以为说的是Wait, Reset确实不能传入Thread Handle
Lactoferrin 2012-03-20
  • 打赏
  • 举报
回复
原因就是tHandle不是事件句柄
ResetEvent对tHandle毫无效果
你检查此函数的返回值和错误码就知道

WaitForSingleObject(tHandle, INFINITE);实际上就是等待那个线程结束,而且那个线程的确会立马结束
  • 打赏
  • 举报
回复
The WaitForSingleObject function checks the current state of the specified object. If the object's state is nonsignaled, the calling thread enters the wait state until the object is signaled or the time-out interval elapses.

The function modifies the state of some types of synchronization objects. Modification occurs only for the object whose signaled state caused the function to return. For example, the count of a semaphore object is decreased by one.

The WaitForSingleObject function can wait for the following objects:


Change notification
Console input
Event
Memory resource notification
Mutex
Process
Semaphore
Thread
Waitable timer
  • 打赏
  • 举报
回复
主要是你等待的时候线程都已经执行完了,所以已经有信号了。 你可以在你的线程例程中增加Sleep,看看效果。

上边有人说不是event句柄,说法已经不适合新版本了,具体哪个版本忘记了,msdn有。 请不要误导楼主。
oniisama 2012-03-20
  • 打赏
  • 举报
回复
检查WaitForSingleObject的返回值,你没CreateEvent,所以WaitForSingleObject可能失败了
加载更多回复(6)

64,646

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

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