2-1

/*
 * 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.004070D8
00401001  |.  53            push    ebx
00401002  |.  8B1D 08604000 mov     ebx, dword ptr [<&KERNEL32.Creat>;  kernel32.CreateThread
00401008  |.  55            push    ebp
00401009  |.  8B2D 04604000 mov     ebp, dword ptr [<&KERNEL32.Close>;  kernel32.CloseHandle
0040100F  |.  56            push    esi
00401010  |.  57            push    edi
00401011  |.  33FF          xor     edi, edi
00401013  |>  8D4424 10     /lea     eax, dword ptr [esp+10]
00401017  |.  50            |push    eax
00401018  |.  6A 00         |push    0
0040101A  |.  57            |push    edi
0040101B  |.  68 60104000   |push    00401060
00401020  |.  6A 00         |push    0
00401022  |.  6A 00         |push    0
00401024  |.  FFD3          |call    ebx
00401026  |.  8BF0          |mov     esi, eax
00401028  |.  85F6          |test    esi, esi
0040102A  |.  74 11         |je      short 0040103D
0040102C  |.  57            |push    edi
0040102D  |.  68 30704000   |push    00407030                        ;  ASCII "Thread launched %d",LF
00401032  |.  E8 59000000   |call    00401090
00401037  |.  83C4 08       |add     esp, 8
0040103A  |.  56            |push    esi
0040103B  |.  FFD5          |call    ebp
0040103D  |>  47            |inc     edi
0040103E  |.  83FF 05       |cmp     edi, 5
00401041  |.^ 7C D0         \jl      short 00401013
00401043  |.  68 D0070000   push    7D0                              ; /Timeout = 2000. ms
00401048  |.  FF15 00604000 call    dword ptr [<&KERNEL32.Sleep>]    ; \Sleep这里请挂起主线程,要不主线程退出,程序就Over了
0040104E  |.  5F            pop     edi
0040104F  |.  5E            pop     esi
00401050  |.  5D            pop     ebp
00401051  |.  33C0          xor     eax, eax
00401053  |.  5B            pop     ebx
00401054  |.  59            pop     ecx
00401055  \.  C3            retn

 线程

 

00401060   .  56            push    esi
00401061   .  8B7424 08     mov     esi, dword ptr [esp+8]
00401065   .  57            push    edi
00401066   .  BF 0A000000   mov     edi, 0A                          ;  i=10
0040106B   >  56            push    esi
0040106C   .  56            push    esi
0040106D   .  56            push    esi
0040106E   .  56            push    esi
0040106F   .  56            push    esi
00401070   .  56            push    esi
00401071   .  56            push    esi
00401072   .  56            push    esi
00401073   .  68 44704000   push    00407044                         ;  ASCII "%d%d%d%d%d%d%d%d",LF
00401078   .  E8 13000000   call    00401090                         ;  printf
0040107D   .  83C4 24       add     esp, 24
00401080   .  4F            dec     edi                              ;  i--
00401081   .^ 75 E8         jnz     short 0040106B                   ;  i<=10
00401083   .  5F            pop     edi
00401084   .  33C0          xor     eax, eax
00401086   .  5E            pop     esi
00401087   .  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

 

posted @ 2010-07-07 09:24  南守拥  阅读(314)  评论(0编辑  收藏  举报