C++マルチスレッド(コンピュータのプロセスとスレッド)
7590 ワード
1、コンピュータプロセス
コンピュータオペレーティングシステムでは、プロセスとは、実行可能なファイルが実行されると、システムが作成するカーネルオブジェクトを指します.
「.EXE」を接尾辞とする実行可能プログラムには、1つ以上のプロセスを含めることができ、各プロセスには独自の実行アドレス空間があり、これらのアドレス空間は論理的に異なるプロセスで繰り返し使用することができる.プロセスで実際に機能を実行するのはプロセス内のスレッドであるべきであるため、これらのスレッドは、同じプロセスのアドレス空間を共有するだけです.
2、コンピュータスレッド
スレッドはコンピュータの最小の実行ユニットで、windowsアプリケーションが実行されると、オペレーティングシステムは自動的にスレッド、すなわちメインスレッドを作成します.
1つのプロセスのすべてのスレッドがプロセスアドレス空間を共有するため、同じプロセスで複数のスレッド間の相互通信を実現することができる.
現在、多くのCPUプロセッサは単一スレッド技術しかサポートしていないが、マルチスレッドが実行できるのは、システムプログラムがシステム内の各スレッドに実行時間を割り当て、この実行時間が非常に短いためである.
3、スレッドの作成
API関数CreateThread()
この関数の役割は、スレッドを作成し、スレッドのハンドルを返すことです.
4、イベントオブジェクトの作成
イベントオブジェクトとは,ユーザがプログラムでカーネルオブジェクトの信号有無状態を用いてスレッドの同期を実現することである.
API関数
イベントオブジェクトの作成
イベントオブジェクトをシグナル状態に設定
アクティブリクエストイベントオブジェクト
dwMilliseconds[in]のタイミング間隔はmilliseconds(ミリ秒)である.ゼロ以外の値を指定すると、hHandleタグのオブジェクトがトリガーされるか、時間になるまで関数が待機します.dwMillisecondsが0の場合、オブジェクトはトリガされず、関数は常にすぐに戻ります.dwMillisecondsがINFINITEの場合、オブジェクトがトリガされて信号が返されます.
5、反発対象
反発オブジェクトはイベントオブジェクトと同様にスレッド同期を実現するために使用されるが、反発オブジェクトはスレッド間で使用することができ、反発オブジェクトにはスレッドIDとカウンタが含まれ、スレッドIDは反発オブジェクトを持つスレッドを表し、カウンタは同じスレッドで使用された回数を表すために使用される.
API関数
反発オブジェクトの作成
要求反発オブジェクト(WaitForSingleObject)
反発オブジェクトの解放
コンピュータオペレーティングシステムでは、プロセスとは、実行可能なファイルが実行されると、システムが作成するカーネルオブジェクトを指します.
「.EXE」を接尾辞とする実行可能プログラムには、1つ以上のプロセスを含めることができ、各プロセスには独自の実行アドレス空間があり、これらのアドレス空間は論理的に異なるプロセスで繰り返し使用することができる.プロセスで実際に機能を実行するのはプロセス内のスレッドであるべきであるため、これらのスレッドは、同じプロセスのアドレス空間を共有するだけです.
2、コンピュータスレッド
スレッドはコンピュータの最小の実行ユニットで、windowsアプリケーションが実行されると、オペレーティングシステムは自動的にスレッド、すなわちメインスレッドを作成します.
1つのプロセスのすべてのスレッドがプロセスアドレス空間を共有するため、同じプロセスで複数のスレッド間の相互通信を実現することができる.
現在、多くのCPUプロセッサは単一スレッド技術しかサポートしていないが、マルチスレッドが実行できるのは、システムプログラムがシステム内の各スレッドに実行時間を割り当て、この実行時間が非常に短いためである.
3、スレッドの作成
API関数CreateThread()
この関数の役割は、スレッドを作成し、スレッドのハンドルを返すことです.
HANDLECreateThread(
LPSECURITY_ATTRIBUTESlpThreadAttributes,//SD
SIZE_TdwStackSize,//initialstacksize
LPTHREAD_START_ROUTINElpStartAddress,//threadfunction
LPVOIDlpParameter,//threadargument
DWORDdwCreationFlags,//creationoption
LPDWORDlpThreadId//threadidentifier
);
1 #include <Windows.h>
2 #include <stdio.h>
3 #include "stdafx.h"
4 DWORD WINAPI myfun1(LPVOID lpParameter);
5 DWORD WINAPI myfun2(LPVOID lpParameter);
6 int main()
7 {
8 HANDLE h1,h2;
9 h1=CreateThread(NULL,0,myfun1,NULL,0,NULL);
10 printf(" 1 \r
");
11 h2=CreateThread(NULL,0,myfun2,NULL,0,NULL);
12 printf(" 2 \r
");
13 CloseHandle(h1);
14 CloseHandle(h2);
15 if (getchar()=='q')
16 {
17 return 0;
18 }
19 else
20 {
21 ::Sleep(100);
22 }
23
24 }
25 DWORD WINAPI myfun1(LPVOID lpParameter)
26 {
27 printf(" 1 !\r
");
28 return 0;
29 }
30 DWORD WINAPI myfun2(LPVOID lpParameter)
31 {
32 printf(" 2 !\r
");
33 return 0;
34 }
4、イベントオブジェクトの作成
イベントオブジェクトとは,ユーザがプログラムでカーネルオブジェクトの信号有無状態を用いてスレッドの同期を実現することである.
API関数
イベントオブジェクトの作成
HANDLECreateEvent(
LPSECURITY_ATTRIBUTESlpEventAttributes,//
BOOLbManualReset,//
BOOLbInitialState,//
LPCTSTRlpName //
);
イベントオブジェクトをシグナル状態に設定
BOOL SetEvent(HANDLE hEvent);
アクティブリクエストイベントオブジェクト
DWORD WaitForSingleObject(
HANDLE hHandle,
DWORD dwMilliseconds
);
dwMilliseconds[in]のタイミング間隔はmilliseconds(ミリ秒)である.ゼロ以外の値を指定すると、hHandleタグのオブジェクトがトリガーされるか、時間になるまで関数が待機します.dwMillisecondsが0の場合、オブジェクトはトリガされず、関数は常にすぐに戻ります.dwMillisecondsがINFINITEの場合、オブジェクトがトリガされて信号が返されます.
5、反発対象
反発オブジェクトはイベントオブジェクトと同様にスレッド同期を実現するために使用されるが、反発オブジェクトはスレッド間で使用することができ、反発オブジェクトにはスレッドIDとカウンタが含まれ、スレッドIDは反発オブジェクトを持つスレッドを表し、カウンタは同じスレッドで使用された回数を表すために使用される.
API関数
反発オブジェクトの作成
HANDLE CreateMutex(
LPSECURITY_ATTRIBUTES lpMutexAttributes, // , NULL,
BOOL bInitialOwner, // ,TRUE: ,FALSE:
LPCTSTR lpName //
);
要求反発オブジェクト(WaitForSingleObject)
反発オブジェクトの解放
ReleaseMutex(HWND);