先上代码#include <windows.h>
#include <iostream>
using namespace std;HANDLE h;ULONG WINAPI f1(LPVOID param)
{
for(int i=0;i<100;i++)
{
int rev=::WaitForSingleObject(h,INFINITE);
if(rev==WAIT_OBJECT_0)
{
// ResetEvent(h);
cout<<"the thread1 is:"<<i<<endl;
SetEvent(h);
}
}
return 0;
}
ULONG WINAPI f2(LPVOID param)
{
for(int i=0;i<100;i++)
{
int rev=::WaitForSingleObject(h,INFINITE);
if(rev==WAIT_OBJECT_0)
{
// ResetEvent(h);
cout<<"the thread2 is:"<<i<<endl;
SetEvent(h);
}
}
return 0;
}int main(int argc, char* argv[])
{
DWORD id1,id2;
h=CreateEvent(NULL,FALSE,TRUE,"WANGXU");
CreateThread(NULL,0,f1,NULL,0,&id1);
CreateThread(NULL,0,f2,NULL,0,&id2); Sleep(5000);
return 0;
}
想一下为什么我把主函数中创建的事件设置成手动重置信号,然后将注释F1,F2中RESET的注释删除,对象还是同步不了。
#include <iostream>
using namespace std;HANDLE h;ULONG WINAPI f1(LPVOID param)
{
for(int i=0;i<100;i++)
{
int rev=::WaitForSingleObject(h,INFINITE);
if(rev==WAIT_OBJECT_0)
{
// ResetEvent(h);
cout<<"the thread1 is:"<<i<<endl;
SetEvent(h);
}
}
return 0;
}
ULONG WINAPI f2(LPVOID param)
{
for(int i=0;i<100;i++)
{
int rev=::WaitForSingleObject(h,INFINITE);
if(rev==WAIT_OBJECT_0)
{
// ResetEvent(h);
cout<<"the thread2 is:"<<i<<endl;
SetEvent(h);
}
}
return 0;
}int main(int argc, char* argv[])
{
DWORD id1,id2;
h=CreateEvent(NULL,FALSE,TRUE,"WANGXU");
CreateThread(NULL,0,f1,NULL,0,&id1);
CreateThread(NULL,0,f2,NULL,0,&id2); Sleep(5000);
return 0;
}
想一下为什么我把主函数中创建的事件设置成手动重置信号,然后将注释F1,F2中RESET的注释删除,对象还是同步不了。
解决方案 »
- 急求一个用mfc编写的监控管理系统的客户端和服务器端
- VC如何获得嵌入的Word程序的句柄,和嵌入的Word程序滚动条的句柄
- VS2008的新手使用问题
- 我在dlg中的OnClose()消息中加了退出提示,如果按右上角的关闭按钮,不管选择"是"与"否",程序都退出,怎么回事?
- 问个很菜的问题
- 怎么把界面弹到最上层.
- Windows 编程的问题,请各位老大救命啊.
- mfc下调整状态栏的高度
- 基于单文档的应用程序,使用CHtmlView 打开web页面关闭后,再次打开失败?
- 编辑对话框模板时,四周的一圈蓝色的虚线是干什么的?
- 自制控件及控件继承的问题
- 错误修改:left of '->imageData' must point to class/struct/union
假设第一个线程等到了事件,那么就跳入了if语句中,假设这个时候,时间片刚好结束,那么第二个线程的WaitForSingleObject仍然可以返回。这个时候,就不会保证cout安全了。
解决办法,现在觉得还是用Mutex吧,因为这个函数是将等待和置位统一执行的。
#include <windows.h>
#include <iostream>
using namespace std;HANDLE h;ULONG WINAPI f1(LPVOID param)
{
int rev=::WaitForSingleObject(h,INFINITE);
for(int i=0;i<100;i++)
{
// ResetEvent(h);
cout<<"the thread1 is:"<<i<<endl; }
SetEvent(h);
return 0;
}
ULONG WINAPI f2(LPVOID param)
{
int rev=::WaitForSingleObject(h,INFINITE);
for(int i=0;i<100;i++)
{
// ResetEvent(h);
cout<<"the thread2 is:"<<i<<endl;
}
SetEvent(h);
return 0;
}int main(int argc, char* argv[])
{
DWORD id1,id2;
h=CreateEvent(NULL,FALSE,TRUE,"WANGXU");
CreateThread(NULL,0,f1,NULL,0,&id1);
CreateThread(NULL,0,f2,NULL,0,&id2); Sleep(5000);
return 0;
}
ULONG WINAPI f2(LPVOID param)
{
int rev=::WaitForSingleObject(h,INFINITE);
for(int i=0;i<100;i++)
{
if(rev==WAIT_OBJECT_0)
{
// ResetEvent(h);
cout<<"the thread2 is:"<<i<<endl;
}
}
SetEvent(h);
return 0;
}
将WaitForSingleObject和SetEvent放在for外面,只有for循环完全之后,h才会有信号,即使当线程一失去CPU时间,线程二被调度,由于h无信号,所以线程在WaitForSingleObject处阻塞,只有当线程一的for循环结束后SetEvent被调用,线程二才可以继续下去。
我理解楼主的意思是,他并不要将线程1运行完后再运行线程2,而是保证两个线程“cout输出的字符串不要夹杂在一起”。我理解的是否正确?
呵呵,我就是这样想的,并不是要等一个FOR循环完之后再进入另一个FOR循环,只是要两个循环夹杂输出(但要同步,每次输出一条完整的信息,不然输出的字符串就是乱的)。但是我用临界区和事件查看结果,输出都是交替的,我改变线程的优先级也不行,是哪里出问题了呢??
h=CreateEvent(NULL,FALSE,TRUE,"WANGXU");改为 h=CreateEvent(NULL,FALSE,FALSE,"WANGXU");