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()
[b]Critical Sections (临界区)[/b]
Critical Sections 不是核心对象,因此没有handle这样的东西。和核心对象不同,它存在于进程的内存空间内。
初始化 InitializeCriticalSection()
释放 DeleteCriticalSection()
EnterCriticalSection()
LeaveCriticalSection()
[b]最小锁定时间[/b]
不要长时间锁住一份资源
不要在一个Critical Section之中调用sleep或者任何wait...函数
当以一个同步机制保护一份资源时,这项资源被使用的频率如何?线程必须多快释放这份资源,才能确保整个程序的运作很平顺。
避免Dangling Critical Sections
Critical Section的一个缺点是:没有办法获知进入 Critical Section的那个线程是死是活。由于 Critical Section不是核心对象,如果进入 Critical Section的那个线程结束或者当掉了,而没有调用leave Critical Section的话,系统没有办法将该 Critical Section清楚,如果需要那样的功能,应该使用[b]mutex[/b]
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()
[b]Critical Sections (临界区)[/b]
Critical Sections 不是核心对象,因此没有handle这样的东西。和核心对象不同,它存在于进程的内存空间内。
初始化 InitializeCriticalSection()
释放 DeleteCriticalSection()
EnterCriticalSection()
LeaveCriticalSection()
[b]最小锁定时间[/b]
不要长时间锁住一份资源
不要在一个Critical Section之中调用sleep或者任何wait...函数
当以一个同步机制保护一份资源时,这项资源被使用的频率如何?线程必须多快释放这份资源,才能确保整个程序的运作很平顺。
避免Dangling Critical Sections
Critical Section的一个缺点是:没有办法获知进入 Critical Section的那个线程是死是活。由于 Critical Section不是核心对象,如果进入 Critical Section的那个线程结束或者当掉了,而没有调用leave Critical Section的话,系统没有办法将该 Critical Section清楚,如果需要那样的功能,应该使用[b]mutex[/b]