首先,我先说说我对线程同步的理解。原来我以为的线程同步就是两个线程一起运行,至于怎么运行的,不知道。查了查资料,我发现线程同步其实是不同步的,而我们所说的同步是指CPU分时间片来执行线程1,2,3-----。其实,在执行线程1的时候是锁定了其他的线程,等线程执行完了再去执行其他的线程,所以线程也可以说是不同步的。这是我的理解,希望大家指正。
好了,下面是我遇到的问题:
我开辟了三个线程:
AfxBeginThread(Event1,this);
event1.Lock();
AfxBeginThread(Event2,this);
event2.Lock(); AfxBeginThread(Event3,this);
event3.Lock();疑惑1:为什么我把三个都锁定之后,Event1还能运行?
疑惑2:event1,2,3与Event1,2,3是怎么对应起来了?
UINT Event1(LPVOID pParam)
{
::AfxMessageBox("1");
event2.SetEvent();
}UINT Event2(LPVOID pParam)
{
::AfxMessageBox("2");
event3.SetEvent();
}UINT Event3(LPVOID pParam)
{
::AfxMessageBox("3");
}
好了,下面是我遇到的问题:
我开辟了三个线程:
AfxBeginThread(Event1,this);
event1.Lock();
AfxBeginThread(Event2,this);
event2.Lock(); AfxBeginThread(Event3,this);
event3.Lock();疑惑1:为什么我把三个都锁定之后,Event1还能运行?
疑惑2:event1,2,3与Event1,2,3是怎么对应起来了?
UINT Event1(LPVOID pParam)
{
::AfxMessageBox("1");
event2.SetEvent();
}UINT Event2(LPVOID pParam)
{
::AfxMessageBox("2");
event3.SetEvent();
}UINT Event3(LPVOID pParam)
{
::AfxMessageBox("3");
}
AfxBeginThread(Event1,this);
AfxBeginThread(Event2,this);
AfxBeginThread(Event3,this);
同时开辟这么三个线程会不会有冲突?不锁定任何一个
第一个问题,你对内核变量Lock,和线程执行没有直接关系,除非你自己在线程中用WaitForSingleObject来等待
第二个问题同样让人莫名其妙,内核对象和线程的关系是程序员自己的事,怎么对应看你怎么写代码
AfxBeginThread(Event1,this);
AfxBeginThread(Event2,this);
AfxBeginThread(Event3,this);UINT Event1(LPVOID pParam)
{
::AfxMessageBox("1");
}UINT Event2(LPVOID pParam)
{
::WaitForSingleObject(eventl.m_hObject,0);
::AfxMessageBox("2");
}UINT Event3(LPVOID pParam)
{
::WaitForSingleObject(event2.m_hObject,0);
::AfxMessageBox("3");
}
开始的时候只有Event1执行,当Event1执行完了之后Event2,Event3
同时执行,当Event3执行完再让Event1执行,该怎么写这段代码?
<——————————
| |
Event1——>Event3——>—>———
|——>Event2——>|
===============
Event1都执行完了,还执行什么啊?
另一种方法是用:SuspendThread和ResumeThread,SuspendThread是用来暂停线程,ResumeThread来执行线程
是这个意思吗?两种方法用什么区别吗?
那我上面那个问题,线程2和3只是在等待信号量,没有信号量达到,应该不执行啊?它怎么就执行了呢?
UINT Event1(LPVOID pParam)
{
::AfxMessageBox("1");
}UINT Event2(LPVOID pParam)
{
::WaitForSingleObject(eventl.m_hObject,0);
::AfxMessageBox("2");
}UINT Event3(LPVOID pParam)
{
::WaitForSingleObject(event2.m_hObject,0);
::AfxMessageBox("3");
}
cnzdgs 和 wltg2001 说的对
=========================
有时候,你创建信号量时,用的参数使它一创建时就是有信号的。具体你看一下MSDN
event1.Lock();
AfxBeginThread(Event2,this);
event2.Lock();
AfxBeginThread(Event3,this);
event3.Lock();
你是先创建线程,后Lock,线程执行到WaitForSingleObject的时候,如果event处于unlock状态,自然就执行过去了。