关于多线程下使用event的问题

一小猿 2008-06-02 03:16:46
大家好,有个疑问:在主线程中创建一个事件,接着在派生的一个线程中关闭这个事件,然后让另一个派生的线程去永久等待这个事件,那么会得到什么结果呢?
我认为应该是WaitForSingleObject立即返回WAIT_FAILED,错误码为非法句柄。但事实上没有确定的结果,试了十次左右,9次是一直等待,1次是立即返回WAIT_FAILED。代码如下:
string protect_type;
HANDLE protect_handle;
HANDLE threads_handle[2];

DWORD WINAPI wait_thread (void *lpParam)
{
DWORD ret = WaitForSingleObject (protect_handle, INFINITE);
if (ret == WAIT_OBJECT_0){
cout << "得到了锁" << endl;
}else if (ret == WAIT_ABANDONED){
cout << "锁被抛弃了" << endl;
}else if (ret == WAIT_FAILED){
cout << "等待出错," << GetLastError () << endl;
}
return 0;
}

DWORD WINAPI acquire_thread (void *lpParam)
{
if (protect_type == "mutex"){
WaitForSingleObject (protect_handle, INFINITE);
ResumeThread (threads_handle[1]);
return 0;
}else if (protect_type == "event"){
bool ret = CloseHandle (protect_handle);
ResumeThread (threads_handle[1]);
return 0;
}else
return -1;
}

void test_wait ()
{
//protect_type = "mutex";
//protect_handle = CreateMutex (NULL, false, 0);
protect_type = "event";
protect_handle = CreateEvent (NULL, true, false, 0);
threads_handle[0] = CreateThread (NULL, 0, acquire_thread, 0, CREATE_SUSPENDED, 0);
threads_handle[1] = CreateThread (NULL, 0, wait_thread, 0, CREATE_SUSPENDED, 0);
ResumeThread (threads_handle[0]);
WaitForMultipleObjects (2, threads_handle, TRUE, INFINITE);
}

int main ()
{
test_wait ();
}
...全文
190 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
一小猿 2008-06-03
  • 打赏
  • 举报
回复
我新建了个空的win32控制台项目,将以上源码拷进去试。结果还是不确定,多数情况下,会出现“等待出错,6”,但偶尔会永远等待。有兴趣的朋友可以试一试,目前我没有找到合理的解释,也许要先查查Windows多线程编程了。
liyinlei 2008-06-02
  • 打赏
  • 举报
回复
没错,和你一样。vs2003
一小猿 2008-06-02
  • 打赏
  • 举报
回复
liyinlei,请问你用的是什么环境?我用的是xp sp2下vc7.1
liyinlei 2008-06-02
  • 打赏
  • 举报
回复
按楼主的代码,执行了五六遍,结果是 “等待出错,6”,也就是句柄无效。
没有问题啊!
ouyh12345 2008-06-02
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 lxd121 的回复:]
事件只关闭了一次,而且是在关闭后才在另一线程中wait的。
另一方面,Sleep应该加在哪呢?请赐教。
[/Quote]

在线程启动后立即sleep,确保事件已经关闭后,再wait
一小猿 2008-06-02
  • 打赏
  • 举报
回复
也许真的没有意义,但至少其结果应该是确定的并能被理解的。还是诚肯地等待答复。
zsycloud 2008-06-02
  • 打赏
  • 举报
回复
应该是在你关闭事件后,再创建第二个线程并唤醒运行……
jameshooo 2008-06-02
  • 打赏
  • 举报
回复
这样尝试有意义吗?有谁在实际情况下会这样用?
一小猿 2008-06-02
  • 打赏
  • 举报
回复
事件只关闭了一次,而且是在关闭后才在另一线程中wait的。
另一方面,Sleep应该加在哪呢?请赐教。
ouyh12345 2008-06-02
  • 打赏
  • 举报
回复
用Sleep确保事件关闭的次序

16,472

社区成员

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

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

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