マルチスレッド1 CreateThreadと_beginthreadexの本質的な違い
2138 ワード
1、できるだけ使う_CreateThread()の代わりにbeginthreadex()を使用するのはなぜですか?
_beginthreadex()関数は、新しいスレッドの作成時に_を割り当てて初期化します.tiddataブロック.これはtiddataブロックは、スレッド固有のデータを格納するために自然に使用されます.実際には、新しいスレッドが実行されると、まず_tiddataブロックは自分とさらに関連している.次に、新しいスレッドが標準C実行ライブラリ関数、例えばstrtok()を呼び出すと、先に取得されます.tiddataブロックのアドレスは、保護が必要なデータを格納する_tiddataブロックにあります.これにより、各スレッドは、他のスレッドのデータを改ざんすることなく、自分のデータにアクセスおよび変更するだけです.したがって、コードに標準Cを使用してライブラリ内の関数を実行する場合は、できるだけ_CreateThread()の代わりにbeginthreadex()を使用します.ここまで読んだ时、あなたはこの短い言叶に対してとても深い印象を持つことができると信じて、もし面接官が闻いたら、あなたも流暢で正确な答えができます^^.
2、WaitForSingleObject関数
WaitForSingleObject関数機能:待機関数–指定したカーネルオブジェクトがトリガーされるまでスレッドを待機状態にします.
関数の原形:D W o r d W i n a P i WaitForSingleObject(HANDLEhHandle,DWORDdwMilliseconds);
関数の説明:最初のパラメータは、待機するカーネルオブジェクトです.2番目のパラメータは最も長い待ち時間であり、ミリ秒単位で5000が入力されると5秒を表し、0が入力されるとすぐに戻り、INFINITEが入力されると無限待ちを表す.
スレッドのハンドルはスレッド実行時にトリガーされないため、スレッドは実行を終了し、ハンドルはトリガ状態にある.したがって、WaitForSingleObject()を使用して、スレッドの実行が終了するのを待つことができます.
3、インスタンスプログラム
マルチスレッドプログラムであるため、VC環境、Project->Settings->C/C+->Code Generation->Use run-time libray->Debug Multihread、またはMultithread、またはDebug Multihread DLL、またはMultithread DLLを構成することを覚えておいてください.つまり、Use run-time libraryはマルチスレッドを使用する必要があります.
答えは私たちが想像していた順序数のように1から10まで出力されていません.これはなぜですか.次の節を見てください.
記事の転載先:http://blog.csdn.net/morewindows/article/details/7421759
_beginthreadex()関数は、新しいスレッドの作成時に_を割り当てて初期化します.tiddataブロック.これはtiddataブロックは、スレッド固有のデータを格納するために自然に使用されます.実際には、新しいスレッドが実行されると、まず_tiddataブロックは自分とさらに関連している.次に、新しいスレッドが標準C実行ライブラリ関数、例えばstrtok()を呼び出すと、先に取得されます.tiddataブロックのアドレスは、保護が必要なデータを格納する_tiddataブロックにあります.これにより、各スレッドは、他のスレッドのデータを改ざんすることなく、自分のデータにアクセスおよび変更するだけです.したがって、コードに標準Cを使用してライブラリ内の関数を実行する場合は、できるだけ_CreateThread()の代わりにbeginthreadex()を使用します.ここまで読んだ时、あなたはこの短い言叶に対してとても深い印象を持つことができると信じて、もし面接官が闻いたら、あなたも流暢で正确な答えができます^^.
2、WaitForSingleObject関数
WaitForSingleObject関数機能:待機関数–指定したカーネルオブジェクトがトリガーされるまでスレッドを待機状態にします.
関数の原形:D W o r d W i n a P i WaitForSingleObject(HANDLEhHandle,DWORDdwMilliseconds);
関数の説明:最初のパラメータは、待機するカーネルオブジェクトです.2番目のパラメータは最も長い待ち時間であり、ミリ秒単位で5000が入力されると5秒を表し、0が入力されるとすぐに戻り、INFINITEが入力されると無限待ちを表す.
スレッドのハンドルはスレッド実行時にトリガーされないため、スレッドは実行を終了し、ハンドルはトリガ状態にある.したがって、WaitForSingleObject()を使用して、スレッドの実行が終了するのを待つことができます.
3、インスタンスプログラム
マルチスレッドプログラムであるため、VC環境、Project->Settings->C/C+->Code Generation->Use run-time libray->Debug Multihread、またはMultithread、またはDebug Multihread DLL、またはMultithread DLLを構成することを覚えておいてください.つまり、Use run-time libraryはマルチスレッドを使用する必要があります.
#include <windows.h>
#include <process.h> /* _beginthread, _endthread */
#include <stdio.h>
int g_nCount;
// ,
unsigned int __stdcall ThreadFun(PVOID pM)
{
g_nCount++;
printf(" ID %4d %d
", GetCurrentThreadId(), g_nCount);
return 0;
}
// , 。
int main()
{
printf("
");
printf(" -- by MoreWindows( http://blog.csdn.net/MoreWindows ) --
");
const int THREAD_NUM = 10;
HANDLE handle[THREAD_NUM];
g_nCount = 0;
for (int i = 0; i < THREAD_NUM; i++)
handle[i] = (HANDLE)_beginthreadex(NULL, 0, ThreadFun, NULL, 0, NULL);
WaitForMultipleObjects(THREAD_NUM, handle, TRUE, INFINITE);
return 0;
}
答えは私たちが想像していた順序数のように1から10まで出力されていません.これはなぜですか.次の節を見てください.
記事の転載先:http://blog.csdn.net/morewindows/article/details/7421759