VS 2010マルチスレッドプログラミング
5309 ワード
転載(原文アドレス):VS 2010マルチスレッドプログラミング
この場合、マルチコアCPUの下で、メインスレッドとサブスレッドを同時に実行することができる.
cpuはマルチコアで長い間行われていましたが、シリアルで実行されることが多く、実行速度が低下しました.プロジェクトは信号の取得のために追加のスレッドを開く必要があるからです.(次編では並列実行を学習することにします)スレッドを作成するにはこの関数で十分なようですが、3番目のパラメータが関数パラメータであることしか知りません.
スレッドの特定のパラメータの詳細を作成するには、次の手順に従います.http://www.cnblogs.com/del/category/174761.html関数プロトタイプ戻り値:スレッドハンドル(ポインタのようなもの)は、スレッドがどのプロセスに属しているかにかかわらず、システム内で平等です.優先度が同じ場合、システムは同じ時間間隔(小さい)で各スレッドを実行します.
オブジェクト
区別する
ハンドル
オブジェクトのみを使用-ハンドルのあるオブジェクトは一般的にシステムレベルのオブジェクト(またはカーネルオブジェクト)です-通常、ハンドルを関数(一般的にシステム関数)にコミットした後
ししん
読み取り/書き込み可能オブジェクト
同じ点
メモリ内の小さなブロックデータ(一般的には構造で説明されています)、
2.パラメータ1:セキュリティ設定lpThreadAttributesはTSecurityAttributes構造へのポインタであり、一般的にはNULL(アクセス制限なし)3に設定.パラメータ2:スタックサイズ(スタック:プライベートスタック:共通)各スレッドには独自のスタック(独自のメッセージキューも持つ)がある.デフォルト値は0です.これはシステムのデフォルトのサイズを使用することを意味します.デフォルトはメインスレッドスタックのサイズと同じで、足りない場合は自動的に増加します.
オブジェクト
異なる点
用途
スタック
先入れ先出し
スタック
進んで後出する.
一時的で軽量な変数にアクセスするのに適しており、主に局所変数を格納するために使用される.
同じ点
プロセス内のメモリ領域
4.パラメータ3:入口関数ポインタ(すなわち関数アドレス)入口関数の標準定義.この関数の標準戻り値はDWORDであるべきである.(終了コードによりスレッドが終了するか否かを判断することができる.スレッド終了後、GetExitCodeThread関数で取得した終了コードがこの戻り値です!スレッドが終了しない場合、GetExitCodeThreadが取得した終了コードは定数STILL_になります.ACTIVE (259); 5.パラメータ4:関数パラメータスレッド入口関数のパラメータはタイプレスポインタ(Pointer)であり、任意のデータを指定することができる.6.パラメータ5:起動オプションCreateThreadの最後から2番目のパラメータdwCreationFlags(起動オプション)には2つのオプション値があります.0:スレッドが確立されたら、すぐにエントリ関数を実行します.CREATE_SUSPENDED:スレッドが確立すると保留になります.ResumeThreadリカバリスレッドの実行;SuspendThreadはスレッドを保留します.この2つの関数のパラメータはいずれもスレッドハンドルであり、戻り値は実行前の保留カウントである.PS:保留カウント(count≧0)SuspendThread,count+=1;ResumeThread ,count -=1; if count==0、スレッドrun;>0時に掛けます.SuspendThreadによって複数回行われる場合、スレッドの実行を再開するにはResumeThreadが複数回必要となる.ResumeThreadとSuspendThreadはそれぞれTThreadのResumeとSuspendの方法に対応し、よく理解できる.7.パラメータ6:出力スレッドID
IDはハンドルよりも軽い.メインスレッドにおいてGetCurrentThreadId,MainThreadIDが取得したものはすべてメインスレッドのIDである
スレッドのIDは一意です.ハンドルは1つだけではない、例えばGetCurrentThreadで1つの偽ハンドルを取得することができ、DuplicateHandleで1つのハンドルをコピーすることができるなどである.
IDはハンドルよりも軽い.メインスレッドにおいてGetCurrentThreadId、MainThreadIDが取得するのは、いずれもメインスレッドのIDである.
マルチスレッドテストの例
この場合、マルチコアCPUの下で、メインスレッドとサブスレッドを同時に実行することができる.
#include
#include
#include
using namespace std;
DWORD WINAPI MyThreadProc1(LPVOID lpParameter);
DWORD WINAPI MyThreadProc2(LPVOID lpParameter);
int index = 0;
int i = 0 , y = 0;
int main()
{
HANDLE handle1,handle2;
handle1 = CreateThread(NULL,0,MyThreadProc1,NULL,0,NULL);
handle2 = CreateThread(NULL,0,MyThreadProc2,NULL,0,NULL);
if(NULL == handle1)
{
cout<<"Create Thread failed !"<return -1;
}
if(NULL == handle2)
{
cout<<"Create Thread failed !"<return -1;
}
CloseHandle(handle1);
CloseHandle(handle2);
cout<<"The Main Thread is Running !"<"PAUSE");
return 0;
}
DWORD WINAPI MyThreadProc1(LPVOID lpParameter)
{
cout<<"The MyThreadProc1 is Running !"<return 0;
}
DWORD WINAPI MyThreadProc2(LPVOID lpParameter)
{
cout<<"The MyThreadProc2 is Running ! "<return 0;
}
cpuはマルチコアで長い間行われていましたが、シリアルで実行されることが多く、実行速度が低下しました.プロジェクトは信号の取得のために追加のスレッドを開く必要があるからです.(次編では並列実行を学習することにします)スレッドを作成するにはこの関数で十分なようですが、3番目のパラメータが関数パラメータであることしか知りません.
handle1 = CreateThread(NULL,0,MyThreadProc1,NULL,0,NULL);
スレッドの特定のパラメータの詳細を作成するには、次の手順に従います.http://www.cnblogs.com/del/category/174761.html関数プロトタイプ
function CreateThread(
lpThreadAttributes: Pointer; { }
dwStackSize: DWORD; { }
lpStartAddress: TFNThreadStartRoutine; { }
lpParameter: Pointer; { }
dwCreationFlags: DWORD; { }
var lpThreadId: DWORD { ID }
): THandle; stdcall; { }
オブジェクト
区別する
ハンドル
オブジェクトのみを使用-ハンドルのあるオブジェクトは一般的にシステムレベルのオブジェクト(またはカーネルオブジェクト)です-通常、ハンドルを関数(一般的にシステム関数)にコミットした後
ししん
読み取り/書き込み可能オブジェクト
同じ点
メモリ内の小さなブロックデータ(一般的には構造で説明されています)、
2.パラメータ1:セキュリティ設定lpThreadAttributesはTSecurityAttributes構造へのポインタであり、一般的にはNULL(アクセス制限なし)3に設定.パラメータ2:スタックサイズ(スタック:プライベートスタック:共通)各スレッドには独自のスタック(独自のメッセージキューも持つ)がある.デフォルト値は0です.これはシステムのデフォルトのサイズを使用することを意味します.デフォルトはメインスレッドスタックのサイズと同じで、足りない場合は自動的に増加します.
オブジェクト
異なる点
用途
スタック
先入れ先出し
スタック
進んで後出する.
一時的で軽量な変数にアクセスするのに適しており、主に局所変数を格納するために使用される.
同じ点
プロセス内のメモリ領域
4.パラメータ3:入口関数ポインタ(すなわち関数アドレス)入口関数の標準定義.この関数の標準戻り値はDWORDであるべきである.(終了コードによりスレッドが終了するか否かを判断することができる.スレッド終了後、GetExitCodeThread関数で取得した終了コードがこの戻り値です!スレッドが終了しない場合、GetExitCodeThreadが取得した終了コードは定数STILL_になります.ACTIVE (259); 5.パラメータ4:関数パラメータスレッド入口関数のパラメータはタイプレスポインタ(Pointer)であり、任意のデータを指定することができる.6.パラメータ5:起動オプションCreateThreadの最後から2番目のパラメータdwCreationFlags(起動オプション)には2つのオプション値があります.0:スレッドが確立されたら、すぐにエントリ関数を実行します.CREATE_SUSPENDED:スレッドが確立すると保留になります.ResumeThreadリカバリスレッドの実行;SuspendThreadはスレッドを保留します.この2つの関数のパラメータはいずれもスレッドハンドルであり、戻り値は実行前の保留カウントである.PS:保留カウント(count≧0)SuspendThread,count+=1;ResumeThread ,count -=1; if count==0、スレッドrun;>0時に掛けます.SuspendThreadによって複数回行われる場合、スレッドの実行を再開するにはResumeThreadが複数回必要となる.ResumeThreadとSuspendThreadはそれぞれTThreadのResumeとSuspendの方法に対応し、よく理解できる.7.パラメータ6:出力スレッドID
IDはハンドルよりも軽い.メインスレッドにおいてGetCurrentThreadId,MainThreadIDが取得したものはすべてメインスレッドのIDである
スレッドのIDは一意です.ハンドルは1つだけではない、例えばGetCurrentThreadで1つの偽ハンドルを取得することができ、DuplicateHandleで1つのハンドルをコピーすることができるなどである.
IDはハンドルよりも軽い.メインスレッドにおいてGetCurrentThreadId、MainThreadIDが取得するのは、いずれもメインスレッドのIDである.