Win 32マルチスレッドプログラミング


マルチスレッドの概要
プロセスとスレッドはオペレーティングシステムの概念です.プロセスはアプリケーションの実行例であり、各プロセスはプライベートな仮想アドレス空間、コード、データ、その他の各種システムリソースから構成され、プロセスが実行中に作成したリソースはプロセスの終了に伴って破壊され、使用したシステムリソースはプロセスの終了時に解放または閉鎖される.
スレッドはプロセス内部の実行ユニットです.システムはプロセスを作成した後、実際にそのプロセスを実行した主実行スレッドを起動し、主実行スレッドは関数アドレスの形式で、例えばmainあるいはWinMain関数で、プログラムの起動点をWindowsシステムに提供する.メイン実行スレッドが終了すると、プロセスも終了します.
各プロセスには少なくとも1つのメイン実行スレッドがあり、ユーザーがアクティブに作成する必要はなく、システムによって自動的に作成されます.ユーザーは必要に応じてアプリケーションに他のスレッドを作成し、複数のスレッドが同じプロセスで同時に実行されます.1つのプロセスのすべてのスレッドはこのプロセスの仮想アドレス空間の中で、これらの仮想アドレス空間、グローバル変数とシステム資源を共同で使用しているので、スレッド間の通信は非常に便利で、マルチスレッド技術の応用も比較的に広範である.
マルチスレッドは並列処理を実現することができ、あるタスクがCPU時間を長時間占有することを避けることができる.説明したいのは、現在のシングルプロセッサのシングルコアのコンピュータは、これらのスレッドをすべて実行するために、オペレーティングシステムは独立したスレッドごとにいくつかのCPU時間を手配し、オペレーティングシステムは交代でスレッドにタイムスライスを提供し、これは人に偽象を与え、これらのスレッドが同時に実行されているようだ.このことから、2つの非常にアクティブなスレッドがCPUに対する制御権を奪うために、スレッド切替時に多くのCPUリソースを消費し、かえってシステムの性能を低下させることが分かる.この点はマルチスレッドプログラミング時に注意すべきである.
Win 32 SDK関数はマルチスレッドのプログラム設計をサポートし、オペレーティングシステムの原理における様々な同期、反発、臨界領域などの動作を提供する.Visual C++6.0は以下のバージョンを含み、MFCクラスライブラリを使用してマルチスレッドのプログラム設計を実現し、マルチスレッドのプログラミングをより便利にする.
Win 32マルチスレッドAPIサポート
Win 32は一連のAPI関数を提供し、スレッドの作成、保留、復元、終了、通信などの作業を完了する.以下、その中のいくつかの重要な関数を選択して説明します.
HANDLE CreateThread(LPSECURITY_ATTRIBUTES lpThreadAttributes,
	DWORD dwStackSize,
	LPTHREAD_START_ROUTINE lpStartAddress,
	LPVOID lpParameter,
	DWORD dwCreationFlags,
	LPDWORD lpThreadId);

この関数は、プロセスを呼び出すプロセス空間に新しいスレッドを作成し、構築されたスレッドのハンドルを返します.各パラメータは、lpThreadAttributes:SECURITY_ATTRIBUTES構造のポインタを指し、この構造はスレッドのセキュリティ属性を決定し、一般的にNULLに設定されます.dwStackSize:スレッドのスタック深度を指定し、一般的に0に設定します.lpStartAddress:新しいスレッドの実行開始時にコードが存在する関数のアドレス、すなわちスレッドの開始アドレスを表し、一般的には(LPTHREAD_START_ROUTINE)ThreadFuncであり、ThreadFuncはスレッド関数名である.lpParameter:スレッド実行時にスレッドに転送される32ビットパラメータ、すなわちスレッド関数のパラメータを指定します.dwCreationFlags:スレッド作成を制御する追加フラグで、2つの値をとることができます.このパラメータが0の場合、スレッドは作成された直後に実行されます.このパラメータがCREATE_の場合SUSPENDEDは、システムがスレッドを生成した後、そのスレッドは保留状態にあり、関数ResumeThreadが呼び出されるまですぐに実行されない.lpThreadId:このパラメータは作成したスレッドのIDを返します.作成に成功した場合はスレッドのハンドルを返し、そうでない場合はNULLを返します.
DWORD SuspendThread(HANDLE hThread);

この関数は、指定したスレッドを保留するために使用され、関数の実行に成功すると、スレッドの実行が終了します.
DWORD ResumeThread(HANDLE hThread);

この関数は、スレッドの保留状態を終了し、スレッドを実行するために使用されます.
VOID ExitThread(DWORD dwExitCode);

この関数はスレッドが正常に自身の実行を終了するために使用され(AfxEndThread(スレッドの内部のみ)、PostQuitMessageで1つのスレッドを正常に終了することもできます)、主にスレッドの実行関数で呼び出されます.ここで、パラメータdwExitCodeはスレッドの終了コードを設定するために使用される.
BOOL TerminateThread(HANDLE hThread,DWORD dwExitCode);

一般的に、スレッドの実行が終了すると、スレッド関数は正常に返されますが、アプリケーションはTerminateThreadを呼び出してスレッドの実行を強制的に終了する(スレッドを異常に終了する)ことができます.各パラメータの意味は以下の通りである:hThread:終了するスレッドのハンドル;dwExitCode:スレッドの終了コードを指定します.TerminateThread()を使用してスレッドの実行を終了することは安全ではなく、システムの不安定性を引き起こす可能性がある.この関数は直ちにスレッドの実行を終了するが、スレッドが占有するリソースは解放されず、一般的にこの関数の使用は推奨されない.
BOOL PostThreadMessage(DWORD idThread,
	UINT Msg,
	WPARAM wParam,
	LPARAM lParam);

この関数は、指定したスレッドのメッセージキューにメッセージを格納し、すぐに戻ります(メッセージがスレッドによって処理されるまで待たない).各パラメータの意味は以下の通りである:idThread:メッセージを受信するスレッドのID;Msg:送信するメッセージを指定します.wParam:メッセージに関連するワードパラメータ;lParam:メッセージに関連する長いパラメータ;この関数を呼び出すと、メッセージを受信するスレッドがメッセージループを作成していない場合、関数の実行に失敗します.
BOOL GetExitCodeThread( HANDLE hTread, LPDWORD lpExitCode)

スレッドの終了コードを取得し、hTreadはCWinThreadのメンバー変数m_hTread取得;スレッドがまだ終了していない場合、STILL_ACTIVE(0x103)が得られる.
GetThreadPriority    SetThreadPriority    GetTPriorityClass    SetPriorityClass    //       CWinThread

スレッド優先アクション関数
Win 32マルチスレッドインスタンスの作成
Win 32は、次のようにマルチスレッドコードを作成します.
#include "stdafx.h"
#include 
#include "windows.h"
using namespace std;

DWORD WINAPI ThreadDemoFunc(LPVOID lpParameter);	//    Win32     

int main()
{
	cout<

作者Github:tojohnonly,ブログ:EnskDeCode