首先,我先说说我对线程同步的理解。原来我以为的线程同步就是两个线程一起运行,至于怎么运行的,不知道。查了查资料,我发现线程同步其实是不同步的,而我们所说的同步是指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");
}

解决方案 »

  1.   

    疑惑3:
    AfxBeginThread(Event1,this);     
    AfxBeginThread(Event2,this);
    AfxBeginThread(Event3,this);
    同时开辟这么三个线程会不会有冲突?不锁定任何一个
      

  2.   

    楼主对线程没有理解,对于windows来说,执行的最小单位是线程,系统调度是对线程进行调度,它在调度时是随机的,所以所谓同一个进程中的各个线程同步工作是由程序员自己来处理的。
    第一个问题,你对内核变量Lock,和线程执行没有直接关系,除非你自己在线程中用WaitForSingleObject来等待
    第二个问题同样让人莫名其妙,内核对象和线程的关系是程序员自己的事,怎么对应看你怎么写代码
      

  3.   

    那我改成这样为什么三个进程都运行了?我还没SetEvent() 啊?
    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");
    }
      

  4.   

    如果我想开辟三个线程Event1,Event2,Event3
    开始的时候只有Event1执行,当Event1执行完了之后Event2,Event3
    同时执行,当Event3执行完再让Event1执行,该怎么写这段代码?
        <——————————
       |                 |
    Event1——>Event3——>—>———
          |——>Event2——>|
      

  5.   

    当Event3执行完再让Event1执行,该怎么写这段代码?
    ===============
    Event1都执行完了,还执行什么啊?
      

  6.   

    “线程同步”不是你理解的意思。线程可以看作是在同时运行的多个任务,在很多时候,线程之间存在相互依赖、相互影响,我们需要对线程加以控制,使其有秩序地运行,以确保得到所期望的效果,这种秩序称做“线程同步”。线程同步可以借助事件、临界区、互斥、信号量等对象来实现,简单情况也可以通过原子指令来实现。例如任务A需要等待任务B完成后才能进行,可以创建一个事件对象,线程A中利用WaitForSingleObject等待该事件,然后处理任务A,线程B中处理任务B,然后设置该事件。
      

  7.   

    线程的控制一般就是用两个函数,一个是WaitForSinleObject来等待信号量,在信号量没有到达之前,这个线程在这个函数处阻塞。第二个就是用SuspendThread来暂停线程和ResumeThread来执行线程。
      

  8.   

    您的意思就是说一种方法是用:WaitForSinleObject和SetEvent,WaitForSinleObject用来等待信号量,SetEvent用来设定信号量
    另一种方法是用: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"); 

      

  9.   


    cnzdgs  和 wltg2001 说的对
      

  10.   

    那我上面那个问题,线程2和3只是在等待信号量,没有信号量达到,应该不执行啊?它怎么就执行了呢? 
    =========================
    有时候,你创建信号量时,用的参数使它一创建时就是有信号的。具体你看一下MSDN
      

  11.   

    WaitForSingleObject第二个参数是超时时间(毫秒),你设为0当然不等待啦,想一直等待需要设为INFINITE,也就是-1
      

  12.   

    AfxBeginThread(Event1,this);     
    event1.Lock();
    AfxBeginThread(Event2,this);
    event2.Lock();
    AfxBeginThread(Event3,this);
    event3.Lock();
    你是先创建线程,后Lock,线程执行到WaitForSingleObject的时候,如果event处于unlock状态,自然就执行过去了。