/* * Numbers2.cpp * * Sample code for "Multithreading Applications in Win32" * This is from Chapter 10, Listing 10-2 * * Demonstrate thread startup in MFC * using AfxBeginThread, but prevent * CWinThread from auto-deletion so that * we can wait on the thread. * * Compile with the IDE or: nmake -f numbers2.mak */
#include <afxwin.h>
CWinApp TheApp;
UINT ThreadFunc(LPVOID);
int main(){ CWinThread* pThreads[5];
for (int i=0; i<5; i++) { pThreads[i] = AfxBeginThread( ThreadFunc, (LPVOID)i, THREAD_PRIORITY_NORMAL, 0, CREATE_SUSPENDED ); ASSERT(pThreads[i]); pThreads[i]->m_bAutoDelete = FALSE; pThreads[i]->ResumeThread(); printf("Thread launched %d\n", i); } for (i=0; i<5; i++) { WaitForSingleObject(pThreads[i]->m_hThread, INFINITE); delete pThreads[i]; }
return 0;}
UINT ThreadFunc(LPVOID n){ for (int i=0;i<10;i++) printf("%d%d%d%d%d%d%d%d\n",n,n,n,n,n,n,n,n); return 0;}
od
main thread
00401040 /$ 83EC 14 sub esp, 1400401043 |. 53 push ebx00401044 |. 8B1D 54204000 mov ebx, dword ptr [<&MSVCRT.printf>>; msvcrt.printf0040104A |. 55 push ebp0040104B |. 8B2D 04204000 mov ebp, dword ptr [<&KERNEL32.Resum>; kernel32.ResumeThread00401051 |. 56 push esi00401052 |. 57 push edi00401053 |. 33F6 xor esi, esi00401055 |. 8D7C24 10 lea edi, dword ptr [esp+10]00401059 |> 6A 00 /push 00040105B |. 6A 04 |push 40040105D |. 6A 00 |push 00040105F |. 6A 00 |push 000401061 |. 56 |push esi00401062 |. 68 D0104000 |push 004010D000401067 |. E8 A0000000 |call <jmp.&MFC42.#1105_AfxBeginThrea>0040106C |. 8907 |mov dword ptr [edi], eax ; hanler->pThreads[i]0040106E |. C740 28 00000>|mov dword ptr [eax+28], 000401075 |. 8B40 2C |mov eax, dword ptr [eax+2C]00401078 |. 50 |push eax00401079 |. FFD5 |call ebp ; ResumeThread0040107B |. 56 |push esi0040107C |. 68 20304000 |push 00403020 ; ASCII "Thread launched %d",LF00401081 |. FFD3 |call ebx ; printf00401083 |. 83C4 08 |add esp, 800401086 |. 46 |inc esi ; i++00401087 |. 83C7 04 |add edi, 4 ; pThreads++0040108A |. 83FE 05 |cmp esi, 5 ; i<50040108D |.^ 7C CA \jl short 004010590040108F |. 8B1D 00204000 mov ebx, dword ptr [<&KERNEL32.WaitF>; kernel32.WaitForSingleObject00401095 |. 8D7C24 10 lea edi, dword ptr [esp+10]00401099 |. BD 05000000 mov ebp, 50040109E |> 8B37 /mov esi, dword ptr [edi]004010A0 |. 6A FF |push -1004010A2 |. 8B4E 2C |mov ecx, dword ptr [esi+2C]004010A5 |. 51 |push ecx004010A6 |. FFD3 |call ebx004010A8 |. 85F6 |test esi, esi004010AA |. 74 09 |je short 004010B5004010AC |. 8B16 |mov edx, dword ptr [esi]004010AE |. 6A 01 |push 1004010B0 |. 8BCE |mov ecx, esi004010B2 |. FF52 04 |call dword ptr [edx+4]004010B5 |> 83C7 04 |add edi, 4004010B8 |. 4D |dec ebp004010B9 |.^ 75 E3 \jnz short 0040109E004010BB |. 5F pop edi004010BC |. 5E pop esi004010BD |. 5D pop ebp004010BE |. 33C0 xor eax, eax004010C0 |. 5B pop ebx004010C1 |. 83C4 14 add esp, 14004010C4 \. C3 retn
thread
004010D0 . 53 push ebx004010D1 . 56 push esi004010D2 . 8B7424 0C mov esi, dword ptr [esp+C] ; n004010D6 . 57 push edi004010D7 . 8B3D 54204000 mov edi, dword ptr [<&MSVCRT.printf>>; msvcrt.printf004010DD . BB 0A000000 mov ebx, 0A ; i=10004010E2 > 56 push esi004010E3 . 56 push esi004010E4 . 56 push esi004010E5 . 56 push esi004010E6 . 56 push esi004010E7 . 56 push esi004010E8 . 56 push esi004010E9 . 56 push esi004010EA . 68 34304000 push 00403034 ; ASCII "%d%d%d%d%d%d%d%d",LF004010EF . FFD7 call edi ; printf004010F1 . 83C4 24 add esp, 24004010F4 . 4B dec ebx ; i--004010F5 .^ 75 EB jnz short 004010E2004010F7 . 5F pop edi004010F8 . 5E pop esi004010F9 . 33C0 xor eax, eax004010FB . 5B pop ebx004010FC . C3 retn
ida
.text:00401040.text:00401040 ; =============== S U B R O U T I N E =======================================.text:00401040.text:00401040.text:00401040 ; int __cdecl main(int argc, const char **argv, const char *envp).text:00401040 _main proc near ; CODE XREF: start+DEp.text:00401040.text:00401040 pThreads = word ptr -14h.text:00401040 var_1 = byte ptr -1.text:00401040 argc = dword ptr 4.text:00401040 argv = dword ptr 8.text:00401040 envp = dword ptr 0Ch.text:00401040.text:00401040 sub esp, 14h.text:00401043 push ebx.text:00401044 mov ebx, ds:printf.text:0040104A push ebp.text:0040104B mov ebp, ds:ResumeThread.text:00401051 push esi.text:00401052 push edi.text:00401053 xor esi, esi.text:00401055 lea edi, [esp+24h+pThreads].text:00401059.text:00401059 loc_401059: ; CODE XREF: _main+4Dj.text:00401059 push 0.text:0040105B push 4.text:0040105D push 0.text:0040105F push 0.text:00401061 push esi.text:00401062 push offset ThreadFunc.text:00401067 call ?AfxBeginThread@@YGPAVCWinThread@@P6AIPAX@Z0HIKPAU_SECURITY_ATTRIBUTES@@@Z ; AfxBeginThread(uint (*)(void *),void *,int,uint,ulong,_SECURITY_ATTRIBUTES *).text:0040106C mov [edi], eax ; pTheads[i]=handler.text:0040106E mov dword ptr [eax+28h], 0.text:00401075 mov eax, [eax+2Ch].text:00401078 push eax ; hThread.text:00401079 call ebp ; ResumeThread.text:0040107B push esi.text:0040107C push offset Format ; "Thread launched %d\n".text:00401081 call ebx ; printf.text:00401083 add esp, 8.text:00401086 inc esi.text:00401087 add edi, 4 ; pThreads++.text:0040108A cmp esi, 5 ; i<5.text:0040108D jl short loc_401059.text:0040108F mov ebx, ds:WaitForSingleObject.text:00401095 lea edi, [esp+24h+pThreads].text:00401099 mov ebp, 5.text:0040109E.text:0040109E loc_40109E: ; CODE XREF: _main+79j.text:0040109E mov esi, [edi].text:004010A0 push 0FFFFFFFFh ; dwMilliseconds.text:004010A2 mov ecx, [esi+2Ch].text:004010A5 push ecx ; hHandle.text:004010A6 call ebx ; WaitForSingleObject.text:004010A8 test esi, esi.text:004010AA jz short loc_4010B5.text:004010AC mov edx, [esi].text:004010AE push 1.text:004010B0 mov ecx, esi.text:004010B2 call dword ptr [edx+4];Delete pThread[i].text:004010B5.text:004010B5 loc_4010B5: ; CODE XREF: _main+6Aj.text:004010B5 add edi, 4.text:004010B8 dec ebp.text:004010B9 jnz short loc_40109E.text:004010BB pop edi.text:004010BC pop esi.text:004010BD pop ebp.text:004010BE xor eax, eax.text:004010C0 pop ebx.text:004010C1 add esp, 14h.text:004010C4 retn.text:004010C4 _main endp.text:004010C4
thread
.text:004010D0.text:004010D0 ; =============== S U B R O U T I N E =======================================.text:004010D0.text:004010D0.text:004010D0 ThreadFunc proc near ; DATA XREF: _main+22o.text:004010D0.text:004010D0 var_n = dword ptr 4.text:004010D0.text:004010D0 push ebx.text:004010D1 push esi.text:004010D2 mov esi, [esp+8+var_n].text:004010D6 push edi.text:004010D7 mov edi, ds:printf.text:004010DD mov ebx, 0Ah ; i=10.text:004010E2.text:004010E2 loc_4010E2: ; CODE XREF: ThreadFunc+25j.text:004010E2 push esi.text:004010E3 push esi.text:004010E4 push esi.text:004010E5 push esi.text:004010E6 push esi.text:004010E7 push esi.text:004010E8 push esi.text:004010E9 push esi.text:004010EA push offset aDDDDDDDD ; "%d%d%d%d%d%d%d%d\n".text:004010EF call edi ; printf.text:004010F1 add esp, 24h.text:004010F4 dec ebx ; i--.text:004010F5 jnz short loc_4010E2.text:004010F7 pop edi.text:004010F8 pop esi.text:004010F9 xor eax, eax.text:004010FB pop ebx.text:004010FC retn.text:004010FC ThreadFunc endp.text:004010FC.text:004010FC ; ---------------------------------------------------------------------------.text:004010FD align 10h
转载于:https://www.cnblogs.com/nanshouyong326/archive/2010/07/07/1772653.html
相关资源:fastjson-1.2.53.jar