线程,同步

来源:互联网 发布:迅捷数据恢复注册码 编辑:程序博客网 时间:2024/05/24 01:13

1. MFC应用程序中的线程有两种类型:用户界面线程(User Interface Thread)和工作者线程(Worker Thread)两大类。

用户界面线程可以产生自己的窗口并负责处理相关的窗口消息,拥有单独的消息队列,能够对事件和用户输入做出响应。

工作者线程适用于处理后台任务,而不影响用户对应用程序的使用。工作者线程仅仅由一个函数体实现,其实现简单,便于编程者控制,适用于一些费时的后台任务处理。 


2.在多线程应用程序中,两个或更多的线程同时访问同一数据会导致不可预知的结果,因此保持线程间的同步是一个不可或缺的环节。使隶属于同一进程的各线程协调一致的工作称为线程的同步。

   MFC提供了四种同步方法:临界区(Critical Section)、信号灯(Semapore)、互斥量(Mutex)和事件(Event)[6]。

互斥对象和事件对象属于内核对象,利用内核对象进行线程同步时,速度较慢,但可以在多个进程中的各个线程间进行同步。

关键代码段工作在用户方式下,同步速度快,但易进入死锁状态,因为在等待进入时不能设置超时值。
通常,在编写多线程程序并需要实现同步时,首选的是使用关键代码段,它的使用比较简单。


3.临界区,即关键代码段  CRITICAL_SECTION

   CRITICAL_SECTION是不能够“锁定”资源的,它能够完成的功能是同步不同线程的代码段。

    当一个线程执行了EnterCritialSection之后,cs(CRITICAL_SECTION)里面的信息便被修改了,以指明哪一个线程占用了它,此时并没有任何资源被“锁定”。不管什么资源,其它线程都还是可以访问的(当然,执行的结果可能是错误的)。只不过,在这个线程尚未执行LeaveCriticalSection之前,其它线程碰到EnterCritialSection语句的话,就会处于等待状态,相当于线程被挂起了。 这种情况下,就起到了保护共享资源的作用。
也正由于CRITICAL_SECTION是这样发挥作用的,所以必须把每一个线程中访问共享资源的语句都放在EnterCritialSection 和 LeaveCriticalSection之间。


4.事件

   事件是通过将自身设置为有信号或无信号来通知其它线程,与线程相配合能对消息做出较快反应,适合于工控程序。


5.互斥量

   互斥量适合用来协调多个线程对共享资源的同步访问。


6.创建线程

   CreateThread()是Windows的API函数,线程优先级需由另一个函数确定。AfxBeginThread()由MFC提供,有很多低级控制已经封装。

   CreatThread返回一个句柄,如果不需要使用句柄操控线程,可以CloseHandle(hTread),Windows才会释放资源。CloseHandle后线程仍然会正常执行,只是不能操控它了。

   CreateThread:是Windows的API函数,直截了当的创建了线程。 它没有考虑:(1)C  Runtime中需要对多线程进行纪录和初始化,以保证C函数库工作正常(典型的例子是strtok函数)。(2)MFC也需要知道新线程的创建,也需要做一些初始化工作(当然,如果没用MFC就没事了)。
  _beginthreadex:MS对C Runtime库的扩展函数,首先针对C Runtime库做了一些初始化的工作,以保证C Runtime库工作正常。然后,调用CreateThread真正创建线程。
  AfxBeginThread:MFC中线程创建的函数,首先创建了相应的CWinThread对象,然后调用CWinThread::CreateThread, 在CWinThread::CreateThread中,完成了对线程对象的初始化工作,然后,调用_beginthreadex创建线程。
  实际上,这三个函数之间存在一定的调用关系,第一个纯粹一些,后两个完成自己相应的工作之后,调用前者实现线程的创建


   m_pCheckThread = (CCheckThread*)  AfxBeginThread(RUNTIME_CLASS(Ccheck Thread),  THREAD_PRIORITY_NORMAL, 0,   CREATE_SUSPENDED);

  将对话框指针传给监控线程

   m_pCheckThread->SetOwner(this);




原创粉丝点击