以下是引用bobo2185355在2010-10-18 11:00:18的发言:
我现在唯一不明白的地方就是,举例:3个线程(a,b,c)EVENT初始化为置位,自动复位,当线程a得到时间片执行代码的时候,如果在一个时间片内没有执行完,被WINDOWS挂起到就绪队列,但是线程,b,c,因为此时EVENT的状态是复位的状态,2个线程都被WaitForSingleObjict所拒绝,那么WINDOWS是不是根本就不会把b,c线程放到就绪队列,而是放到阻塞队列,那么就绪队列只有线程a,我晕 怎么又扯到操作系统了,有点晕了 我把书上的代码段复制过来 但是不能全部复制 只把线程函数复制了吧 希望能得到解释,我晕 连我自己都不知道在问什么了,应该是3个线程时间片的分配问题吧,就像我所描述的 b,c线程根本就不会被放到就绪队列里面
_Counter proc uses ebx esi edi,_lParam
inc dwThreads
invoke SetWindowText,hWinCount,addr szStop
and dwOption,not F_STOP
.while ! (dwOption & F_STOP)
invoke WaitForSingleObject,hEvent,INFINITE
inc dwCounter1
mov eax,dwCounter2
inc eax
mov dwCounter2,eax
invoke SetEvent,hEvent
.endw
dec dwThreads
invoke SetWindowText,hWinCount,addr szStart
ret
_Counter endp
我对操作系统的了解几乎为零!所以,我觉得你的理解是很正确的。
3个线程的时间分配问题,犹如大家一起排队上厕所:a进去了,大门就关上了;b、c只好在外面排队(阻塞队列),等待“开门”事件的发生;而a在里面发现,整个厕所只有一个蹲位(即CPU),她刚蹲下去拉了一半,就被(管理员)拉起来,站在“就绪队列”里,让其他人先上了;等轮到a的时间片,a拉完了,出来“开门”,于是才轮到b或C;有一点要明白:“开门”或“关门”事件都是在线程中执行的。