c++マルチスレッド反発量

2702 ワード

Mutex反発量もカーネルオブジェクトであり、各スレッドが1つのリソースへのアクセスを独占することを保証するために使用されます.反発量は臨界領域と似ていますが、反発量は異なるプロセス間のスレッドのリソースへのアクセスに使用できます.
主に4つの関数を使用します.
反発量の作成(イベントEventの作成関数との比較に注意)関数プロトタイプ:HANDLE CreateMutex(LPSECURITY_ATTRIBUTES lpMutexAttributes,BOOL bInitialOwner,LPCTSTR lpName);関数の説明:最初のパラメータはセキュリティ制御を表し、一般的にNULLに直接入力されます.2番目のパラメータは、反発量の初期所有者を決定するために使用される.入力TRUEが、反発量オブジェクトの内部に作成されたスレッドのスレッドID番号が記録され、再帰カウントが1に設定されていることを示す場合、このスレッドIDはゼロではないため、反発量は非トリガ状態にある.FALSEが送信されると、反発量オブジェクト内のスレッドID番号がNULLに設定され、再帰カウントが0に設定されます.これは、反発量がスレッドに占有されず、トリガ状態にあることを意味します.3番目のパラメータは、複数のプロセスのスレッドが同じ反発量にアクセスしていることを確認するために使用されます.反発量を表すハンドルを正常に返し、NULLを返すことに失敗しました.反発関数のプロトタイプを開く:HANDLE OpenMutex(DWORDdwDesiredAccess,BOOL bInheritHandle,LPCTSTR lpName//名前);関数の説明:最初のパラメータはアクセス権限を表し、反発量に対して一般的にMUTEX_に転送されます.ALL_ACCESS. 2番目のパラメータは反発量ハンドル継承性を表し、一般的にTRUEに伝達すればよい.3番目のパラメータは名前を表します.あるプロセスのスレッドが反発量を作成すると、他のプロセスのスレッドはこの関数でこの反発量を見つけることができます.反発量を表すハンドルを正常に返し、NULLを返すことに失敗しました.反発量関数プロトタイプのトリガー:BOOLReleaseMutex(HANDLEhMutex)関数説明:反発リソースにアクセスする前に待機関数を呼び出すべきで、アクセスが終了するとReleaseMutex()を呼び出してアクセスが終了したことを示し、他のスレッドがアクセスを開始できるようにします.反発量のクリーンアップ反発量はカーネルオブジェクトなのでCloseHandle()を使用すればよい
反発量は同期の問題を解決できない.
反発量は、複数のプロセス間のスレッド反発に使用でき、あるプロセスの予期せぬ終了による廃棄問題を完璧に解決できます.
//       0 ,        ,       1 ,       
HANDLE mutex = INVALID_HANDLE_VALUE;
typedef struct param{
	int a;
	bool b;
	double c;
	string d;
};

unsigned int __stdcall threadfun1(LPVOID p){
	Sleep(100);
	//          ,          
	WaitForSingleObject(mutex,INFINITE);
	param* funparam = (param*) p;
	cout<<"fun1 running:"<<funparam->d<<endl;
	funparam->c *= funparam->a; 
	cout<<"ans:"<<funparam->c<<endl;
	//     ,     
	ReleaseMutex(mutex);
	return 0;
}
DWORD __stdcall threadfun2(LPVOID p){
	Sleep(100);
	//          ,          
	WaitForSingleObject(mutex,INFINITE);
	param* funparam = (param*) p;
	cout<<"fun2 running:"<<funparam->d<<endl;
	funparam->c /= funparam->a; 
	cout<<"ans:"<<funparam->c<<endl;
	//     ,     
	ReleaseMutex(mutex);
	return 0;
}

int main(){
	param p={5,true,9.995,"hello world"};
	//A         ASCII   ,   UNICODE, W。
	//      false,        ,  true     。
	mutex = CreateMutexA(NULL,false,"MUTEX");
	//        ,          ,              
	mutex = OpenMutexA(MUTEX_ALL_ACCESS,true,"MUTEX");
	HANDLE newthread1 = (HANDLE)_beginthreadex(NULL,0,threadfun1,&p,0,NULL);
	HANDLE newthread2 = CreateThread(NULL,0,threadfun2,&p,0,NULL);
	WaitForSingleObject(newthread2,INFINITE);
	WaitForSingleObject(newthread1,INFINITE);
	CloseHandle(mutex);
	system("PAUSE");
}