2-1

it2022-05-09  25

/* * 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


最新回复(0)