天天看點

Windows下使用CreateThread()和_beginthreadex()的差別

根據《Win32多線程程式設計》中的介紹,當建立的子程式中包含某些C runtime 函數時,不應該使用

CreateThread()

如果主線程以外的任意建立的線程中包含以下操作,則應該使用多線程版本的C runtime library,并使用

_beginthreadex()

_endthreadex()

  • 在C程式中使用

    malloc()

    free()

    ,或者在C++程式中使用

    new()

    delete()

  • 調用

    stdio.h

    io.h

    中聲明的任何函數,包括

    fopen()

    open()

    getchar()

    write()

    printf()

    等等。所有這些函數都用到共享的資料結構以及

    errno

    。對于格式化操作,如果不想使用C runtime library的函數,你可以使用

    wsprintf()

    來替代

    printf()

    (wsprintf()是Win核心自己實作的,不依賴于C runtime library,其與printf()大同小異,唯一差別是在浮點數的處理上不同);
  • 使用浮點變量或者浮點運算函數;
  • 調用任何一個使用了靜态緩沖區的runtime函數,如

    asctime()

    strtok

    rand()

如果建立的線程裡面沒有以上列出來的事項,則可以用單線程版本的runtime library和CreateThread()。

此外,如果要在MFC程式中産生一個線程,而該線程将調用MFC函數或使用MFC的任何資料,那麼必須使用

AfxBeginThread()

CWinThread::CreateThread()

來産生線程。