我有两个线程threadA,threadB
threadA()
{
.....
doSomething1();
.....
}
threadB()
{
....
doSomething2();
....
}
我希望doSomething1()和doSomething2()能交替执行,即doSomething1执行完了,通知threadB执行doSomething2,doSomething2执行完了通知threadA执行doSomething1
我想用cevent做同步,可是不太会用,请指教,请添加代码
需要CSingleLock么,我不明白它是做什么的
threadA()
{
.....
doSomething1();
.....
}
threadB()
{
....
doSomething2();
....
}
我希望doSomething1()和doSomething2()能交替执行,即doSomething1执行完了,通知threadB执行doSomething2,doSomething2执行完了通知threadA执行doSomething1
我想用cevent做同步,可是不太会用,请指教,请添加代码
需要CSingleLock么,我不明白它是做什么的
threadA()
{
m_dataLock.Lock();
doSomething1();
m_dataLock.Unlock();
}
threadB()
{
m_dataLock.Lock();
doSomething2();
m_dataLock.Unlock();
}...
http://www.csdn.net/Expert/Forum.asp?roomid=1&typenum=2
g_hEvent[0]=CreateEvent(NULL,FALSE,FALSE,_T("BeginThreadB"));
g_hEvent[1]=CreateEvent(NULL,FALSE,FALSE,_T("BeginThreadA"));
SetEvent(g_hEvent[1]);
threadA()
{
while (true)
{
if(WaitForSingleObject(g_hEvent[1],0)==WAIT_OBJECT_0)
{
ResetEvent(g_hEvent[1]);
break;
}
}
.....
doSomething1();
SetEvent(g_hEvent[0]);
}
threadB()
{
while (true)
{
if(WaitForSingleObject(g_hEvent[0],0)==WAIT_OBJECT_0)
{
ResetEvent(g_hEvent[0]);
break;
}
}
.....
doSomething2();
SetEvent(g_hEvent[1]);
}这样就是一个死循环了,怎么样控制退出你自己定吧。
我也是用CCriticalSection
也可以用全局变量
threadA()
{
while (true)
{
doSomething1();
}
}
threadB()
{
while (true)
{
doSomething2();
等待doSomething1做完;
doSomething3();
}
.....
}即threadA不受干扰的运行,而threadB需要等待。我不会使用同步类,我不明白msdn上为什么说CSingleLock要与同步类一起使用
还有CEvent,设为自动方式,一旦等到事件,马上又变成非信号状态,那什么时候再变成信号状态?
你还可以设置信号量
然后waitsingleobject来同步
是同步函数
用来同步,线程、进程、事件、和作业
在a,运行完后,再运行bwaitmultiobject
功能类似
不过可以等待多个目标一要做的是等待一个线程中的一部分,所以不能单纯等待线程
所以2i3i4i(2i3i4i) 创建了个时间event来做等待目标,就是在
目标线程中加了个标记,用来等待
现在应该明白了吧!!!
HANDLE g_hEvent=CreateEvent(NULL,FALSE,FALSE,_T("WaitingForA"));threadA()
{
doSomething1();
SetEvent(g_hEvent);
}
threadB()
{
if(WaitForSingleObject(g_hEvent,0)==WAIT_OBJECT_0)
{
ResetEvent(g_hEvent);
break;
}
}
.....
doSomething2();
doSomething3();
}
有点仓促,凑和着看吧!OK?
HANDLE g_hEvent=CreateEvent(NULL,FALSE,FALSE,_T("WaitingForA"));threadA()
{ 我是不是应该加在这里,我不明白的是手动方式event
<-----------------------------------
doSomething1(); ResetEvent后,什么时候再变为有信号状态?|
SetEvent(g_hEvent); |
} |
threadB() |
{ |
if(WaitForSingleObject(g_hEvent,0==WAIT_OBJECT_0) |
{ |
ResetEven(g_hEvent);-------------
break;
}
}
.....
doSomething2();
doSomething3();
}
WaitForSingleObject(g_hEvent,0==WAIT_OBJECT_0)是要等待
g_hEvent
SetEvent(g_hEvent);
是说当
doSomething1();
运行过后,
g_hEvent就处于激活状态
等待状态才会结束跳出等待
执行下面的程序
ResetEven(g_hEvent);
是重置g_hEvent的状态
为以后循环使用做准备
如果不想在执行doSomething1();
那可惜省去,没太大影响!
OK?
明白?