/* * Numbers.c * * Sample code for "Multithreading Applications in Win32" * This is from Chapter 2, Listing 2-1 * * Starts five threads and gives visible feedback * of these threads running by printing a number * passed in from the primary thread. * */
#define WIN32_LEAN_AND_MEAN#include <stdio.h>#include <stdlib.h>#include <windows.h>
DWORD WINAPI ThreadFunc(LPVOID);
int main(){ HANDLE hThrd; DWORD threadId; int i; for (i=0; i<5; i++) { hThrd = CreateThread(NULL, 0, ThreadFunc, (LPVOID)i, 0, &threadId ); if (hThrd) { printf("Thread launched %d\n", i); CloseHandle(hThrd); } } // Wait for the threads to complete. // We'll see a better way of doing this later. Sleep(2000);
return EXIT_SUCCESS;}
DWORD WINAPI ThreadFunc(LPVOID n){ int i; for (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
主线程
00401000 /$ 51 push ecx ; Numbers.004070D800401001 |. 53 push ebx00401002 |. 8B1D 08604000 mov ebx, dword ptr [<&KERNEL32.Creat>; kernel32.CreateThread00401008 |. 55 push ebp00401009 |. 8B2D 04604000 mov ebp, dword ptr [<&KERNEL32.Close>; kernel32.CloseHandle0040100F |. 56 push esi00401010 |. 57 push edi00401011 |. 33FF xor edi, edi00401013 |> 8D4424 10 /lea eax, dword ptr [esp+10]00401017 |. 50 |push eax00401018 |. 6A 00 |push 00040101A |. 57 |push edi0040101B |. 68 60104000 |push 0040106000401020 |. 6A 00 |push 000401022 |. 6A 00 |push 000401024 |. FFD3 |call ebx00401026 |. 8BF0 |mov esi, eax00401028 |. 85F6 |test esi, esi0040102A |. 74 11 |je short 0040103D0040102C |. 57 |push edi0040102D |. 68 30704000 |push 00407030 ; ASCII "Thread launched %d",LF00401032 |. E8 59000000 |call 0040109000401037 |. 83C4 08 |add esp, 80040103A |. 56 |push esi0040103B |. FFD5 |call ebp0040103D |> 47 |inc edi0040103E |. 83FF 05 |cmp edi, 500401041 |.^ 7C D0 \jl short 0040101300401043 |. 68 D0070000 push 7D0 ; /Timeout = 2000. ms00401048 |. FF15 00604000 call dword ptr [<&KERNEL32.Sleep>] ; \Sleep这里请挂起主线程,要不主线程退出,程序就Over了0040104E |. 5F pop edi0040104F |. 5E pop esi00401050 |. 5D pop ebp00401051 |. 33C0 xor eax, eax00401053 |. 5B pop ebx00401054 |. 59 pop ecx00401055 \. C3 retn
线程
00401060 . 56 push esi00401061 . 8B7424 08 mov esi, dword ptr [esp+8]00401065 . 57 push edi00401066 . BF 0A000000 mov edi, 0A ; i=100040106B > 56 push esi0040106C . 56 push esi0040106D . 56 push esi0040106E . 56 push esi0040106F . 56 push esi00401070 . 56 push esi00401071 . 56 push esi00401072 . 56 push esi00401073 . 68 44704000 push 00407044 ; ASCII "%d%d%d%d%d%d%d%d",LF00401078 . E8 13000000 call 00401090 ; printf0040107D . 83C4 24 add esp, 2400401080 . 4F dec edi ; i--00401081 .^ 75 E8 jnz short 0040106B ; i<=1000401083 . 5F pop edi00401084 . 33C0 xor eax, eax00401086 . 5E pop esi00401087 . C2 0400 retn 4
ida
.text:00401000.text:00401000 ; =============== S U B R O U T I N E =======================================.text:00401000.text:00401000.text:00401000 ; int __cdecl main(int argc, const char **argv, const char *envp).text:00401000 _main proc near ; CODE XREF: start+AFp.text:00401000.text:00401000 ThreadId = dword ptr -4.text:00401000 argc = dword ptr 4.text:00401000 argv = dword ptr 8.text:00401000 envp = dword ptr 0Ch.text:00401000.text:00401000 push ecx.text:00401001 push ebx.text:00401002 mov ebx, ds:CreateThread.text:00401008 push ebp.text:00401009 mov ebp, ds:CloseHandle.text:0040100F push esi.text:00401010 push edi.text:00401011 xor edi, edi ; i=0.text:00401013.text:00401013 loc_401013: ; CODE XREF: _main+41j.text:00401013 lea eax, [esp+14h+ThreadId].text:00401017 push eax ; lpThreadId.text:00401018 push 0 ; dwCreationFlags.text:0040101A push edi ; lpParameter.text:0040101B push offset StartAddress ; lpStartAddress.text:00401020 push 0 ; dwStackSize.text:00401022 push 0 ; lpThreadAttributes.text:00401024 call ebx ; CreateThread.text:00401026 mov esi, eax.text:00401028 test esi, esi.text:0040102A jz short loc_40103D.text:0040102C push edi.text:0040102D push offset aThreadLaunched ; "Thread launched %d\n".text:00401032 call printf.text:00401037 add esp, 8.text:0040103A push esi ; hObject.text:0040103B call ebp ; CloseHandle.text:0040103D.text:0040103D loc_40103D: ; CODE XREF: _main+2Aj.text:0040103D inc edi.text:0040103E cmp edi, 5 ; i<5.text:00401041 jl short loc_401013.text:00401043 push 7D0h ; dwMilliseconds.text:00401048 call ds:Sleep.text:0040104E pop edi.text:0040104F pop esi.text:00401050 pop ebp.text:00401051 xor eax, eax.text:00401053 pop ebx.text:00401054 pop ecx.text:00401055 retn.text:00401055 _main endp.text:00401055.text:00401055 ; ---------------------------------------------------------------------
thread
.text:00401060.text:00401060 ; =============== S U B R O U T I N E =======================================.text:00401060.text:00401060.text:00401060 ; DWORD __stdcall StartAddress(LPVOID).text:00401060 StartAddress proc near ; DATA XREF: _main+1Bo.text:00401060.text:00401060 n = dword ptr 4.text:00401060.text:00401060 push esi.text:00401061 mov esi, [esp+4+n].text:00401065 push edi.text:00401066 mov edi, 0Ah ; i=10.text:0040106B.text:0040106B loc_40106B: ; CODE XREF: StartAddress+21j.text:0040106B push esi.text:0040106C push esi.text:0040106D push esi.text:0040106E push esi.text:0040106F push esi.text:00401070 push esi.text:00401071 push esi.text:00401072 push esi.text:00401073 push offset aDDDDDDDD ; "%d%d%d%d%d%d%d%d\n".text:00401078 call printf.text:0040107D add esp, 24h.text:00401080 dec edi ; i--.text:00401081 jnz short loc_40106B.text:00401083 pop edi.text:00401084 xor eax, eax.text:00401086 pop esi.text:00401087 retn 4.text:00401087 StartAddress endp.text:00401087.text:00401087 ; ---------------------------------------------------------------------------.text:0040108A align 10h
转载于:https://www.cnblogs.com/nanshouyong326/archive/2010/07/07/1772619.html
