论坛首页 编程语言技术论坛

The Microsoft Threading Model 微软的多线程模型

浏览 2249 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (8) :: 隐藏帖 (0)
作者 正文
   发表时间:2009-12-31   最后修改:2009-12-31
windows线程分为GUI线程和worker线程。
GUI线程负责建造窗口以及处理主消息循环,worker负责执行纯粹运算工作。
GUI线程的定义是:拥有消息队列的线程,任何一个特定窗口的消息总是被产生这一窗口的线程抓到并处理,所有对此窗口的改变也都应该由该线程完成。
如果worker线程也产生一个窗口,那么就会有一个消息队列随之被产生出来并且附着到此线程上,于是worker线程变成了GUI线程。这里意思是,worker线程不能够产生窗口,对话框,消息框,或任何其他与UI有关的东西。
    pInfo = HeapAlloc(GetProcessHeap(),
                      HEAP_ZERO_MEMORY,
                      sizeof(ThreadPrintInfo));

    // free data structure passed in.
    HeapFree(GetProcessHeap(), 0, pInfo);

GetTickCount()

Critical Sections (临界区)
Critical Sections 不是核心对象,因此没有handle这样的东西。和核心对象不同,它存在于进程的内存空间内。
初始化 InitializeCriticalSection()
释放   DeleteCriticalSection()

EnterCriticalSection()

LeaveCriticalSection()

最小锁定时间
不要长时间锁住一份资源
不要在一个Critical Section之中调用sleep或者任何wait...函数
当以一个同步机制保护一份资源时,这项资源被使用的频率如何?线程必须多快释放这份资源,才能确保整个程序的运作很平顺。

避免Dangling Critical Sections
Critical Section的一个缺点是:没有办法获知进入 Critical Section的那个线程是死是活。由于 Critical Section不是核心对象,如果进入 Critical Section的那个线程结束或者当掉了,而没有调用leave Critical Section的话,系统没有办法将该 Critical Section清楚,如果需要那样的功能,应该使用mutex


论坛首页 编程语言技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics