研究罗文彬的书,这看不明白啊。有高手帮忙解答下吗。万分感谢。
;就是第12章,用户自己用事件控制线程同步的时候。没有置位啊。按道理来说,第二个线程,包括那个定时事件,都没法执;行啊。
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; Sample code for < Win32ASM Programming 2nd Edition>
; by 罗云彬, http://asm.yeah.net
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; ThreadSyn.asm
; 使用事件对象进行线程之间的同步
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; 使用 nmake 或下列命令进行编译和链接:
; ml /c /coff ThreadSyn.asm
; rc ThreadSyn.rc
; Link /subsystem:windows ThreadSyn.obj ThreadSyn.res
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
.386
.model flat, stdcall
option casemap :none
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; Include 文件定义
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
includewindows.inc
includeuser32.inc
includelibuser32.lib
includekernel32.inc
includelibkernel32.lib
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; Equ 等值定义
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
ICO_MAINequ1000
DLG_MAINequ1000
IDC_COUNTER1equ1001
IDC_COUNTER2equ1002
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; 数据段
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
.data?
hInstancedd?
hWinMaindd?
hWinCountdd?
dwCounter1dd?
dwCounter2dd?
dwThreadsdd?
hEventdd?
dwOptiondd?
F_STOPequ0001h
.const
szStopdb'停止计数',0
szStartdb'计数',0
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; 代码段
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
.code
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
_Counterprocuses ebx esi edi,_lParam
incdwThreads
invokeSetWindowText,hWinCount,addr szStop
anddwOption,not F_STOP
.while! (dwOption & F_STOP)
;****************************************************
;****************************************************
;****************************************************
;****************************************************
;****************************************************
;****************************************************
; 问题:第一个线程可以通过这,后面的线程等在这,****************************************************
invokeWaitForSingleObject,hEvent,INFINITE
incdwCounter1
moveax,dwCounter2
inceax
movdwCounter2,eax
;第一个线程让线程置位,然后他循环,会调用上面的WaitForSingleObject,而此时是置位的,****************
;那这个线程应该继续执行啊。所以第二第三个线程根本没法执行吧 我这样理解对吗。************************
;同样的,下面的定时事件应该也不能执行啊。
invokeSetEvent,hEvent
.endw
decdwThreads
invokeSetWindowText,hWinCount,addr szStart
ret
_Counterendp
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
_ProcDlgMainprocuses ebx edi esi hWnd,wMsg,wParam,lParam
local@dwThreadID
moveax,wMsg
;********************************************************************
.ifeax ==WM_TIMER
invokeWaitForSingleObject,hEvent,INFINITE
invokeSetDlgItemInt,hWinMain,IDC_COUNTER1,dwCounter1,FALSE
invokeSetDlgItemInt,hWinMain,IDC_COUNTER2,dwCounter2,FALSE
invokeSetEvent,hEvent
;********************************************************************
.elseifeax ==WM_COMMAND
moveax,wParam
.ifax ==IDOK
.ifdwThreads
ordwOption,F_STOP
invokeKillTimer,hWnd,1
.else
movdwCounter1,0
movdwCounter2,0
xorebx,ebx
.whileebx <20
invokeCreateThread,NULL,0,offset _Counter,NULL,\
NULL,addr @dwThreadID
invokeCloseHandle,eax
incebx
.endw
invokeSetTimer,hWnd,1,500,NULL
.endif
.endif
;********************************************************************
.elseifeax ==WM_CLOSE
.if! dwThreads
invokeCloseHandle,hEvent
invokeEndDialog,hWnd,NULL
.endif
;********************************************************************
.elseifeax ==WM_INITDIALOG
pushhWnd
pophWinMain
invokeGetDlgItem,hWnd,IDOK
movhWinCount,eax
invokeCreateEvent,NULL,FALSE,TRUE,NULL
movhEvent,eax
;********************************************************************
.else
moveax,FALSE
ret
.endif
moveax,TRUE
ret
_ProcDlgMainendp
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
start:
invokeGetModuleHandle,NULL
movhInstance,eax
invokeDialogBoxParam,eax,DLG_MAIN,NULL,offset _ProcDlgMain,NULL
invokeExitProcess,NULL
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
endstart
;万分感谢啊。。。。高手。
[解决办法]
不太懂线程同步,等高手
[解决办法]
这个要多核CPU吧
[解决办法]
线程的同步和 cpu 的核心数没有关系吧。
同步问题,这个本来就很绕,实现的方法也不少,各有各的说法和用途;这个问题有些难!
你这里,用的是 EVENT 对象来实现的,初始是 Signaled 状态,所以第一线程的 Wait() 很快就返回了;这时如果有第二线程(程序一共会创建 20 个吧)接着 Wait() 的话,就会 hold 住的,无法继续;但第一线程在对两计数器操作完毕后,SetEvent() 会再次将 EVENT 进入 Signaled 状态,这时那些等待状态的进程就会有返回 Wait() 以对两计数器进行操作的进行,然后再释放 EVENT;如此循环,直至“停止计数”。