相互排除とスレッドの同期(3) - Windowsのミューテックス

mutexロック/ミューテックスは何ですか?

プログラミングでは、ミューテックスオブジェクトの概念は、共有データ操作の整合性を確保することです。選択された、マーカーの各オブジェクトが対応する「は、相互排他ロック」と呼ばれることができ、このタグは、オブジェクトにアクセスするためのいずれかの時間、唯一のスレッドでいることを保証するために使用されている-ミューテックスBaiduの百科事典

ミューテックスにアクセスするための唯一のスレッド、他のスレッド要求された場合は、ミューテックスを占有し、ロック要求スレッドが中断されていること。ロック所有者は、スレッドがミューテックスを所有しているロックするミューテックス、CPUスケジューリング要求を解放するまで、スレッドが起こされます。


次のようにミューテックスのWindowsに関連した機能は次のとおりです。

  • CreateCreateMutex(LPSECURITY_ATTRIBUTES lpMutexAttributes、BOOL bInitialOwner、LPCWSTR lpName); //ミューテックスを作成します。
  • WaitForSingleObject(HANDLE hHandle、dwMilliseconds DWORD); //ウェイト要求は、ミューテックスを占めています
  • ReleaseMutex(HANDLEのhMutex); //ミューテックスを解放

  1. CreateCreateMutexの機能、ミューテックスの作成を表し、
  • パラメータlpMutexAttributes:急行セキュリティプロパティ、通常に設定nullptrは、デフォルトのセキュリティ属性を示します。
  • パラメータbInitialOwnerは:すぐに作成されたミューテックスを所有した後、あるかどうかを示しTRUEが、それはすぐに持っていることを示し、FALSEは、彼らはすぐに持っていなかったと述べました。
  • パラメータlpNameは:名前のミューテックスを示します。あなたは、名前のミューテックスを設定し、または別のスレッド間で共有することができます名前で、あなたは明確な証拠を設定しない場合に設定することができnullptr
  • 戻り値:成功したリターンミューテックスハンドル。リターンに失敗nullptr
  1. WaitForSingleObject機能、ミューテックス待ち要求を占め表します。
  • パラメータhHandle:ハンドル。この関数は、要求ミューテックスないだけに使用することができ、それはまた、スレッドの終了処理を待っているように、使用することができ、セマフォ、ミューテックスの所有、及び信号待ち待っ。
  • パラメータdwMilliseconds:ミリ秒数を示します。設定INFINITEは無期限に待機表します。
  • 戻り値:
返却値 説明
WAIT_FAILED これは、関数を表すのWaitForSingleObject呼び出しが失敗し、あなたが機能する)のGetLastErrorを(エラーコードを取得するには
WAIT_OBJECT_0 セットターゲットに成功するまで待ち
WAIT_TIMEOUT これは、タイムアウトを待って表し
WAIT_ABANDONED 対象ミューテックス場合は、スレッドがミューテックスオブジェクトを保持している表しは終了しましたが、ミューテックスを解放しませんでした。今回は、オブジェクトがミューテックスの状態を放棄しています。挙動は不明であるが、推奨されません
  1. ReleaseMutexの機能は、リリースミューテックスを示しています。
  • パラメータhMutexのミューテックスハンドル

以下も使用し、ミューテックスの使用の簡単な例であるCThreadを
ヘッダー:

class WinMutexThread : public CThread
{
public:
	void run(void) override;

	// 初始化Mutex,用于创建互斥锁
	static void initMutex(void);

private:
	// 互斥锁
	static HANDLE m_mutexHandle;
};

ソースファイル:

#include <iostream>

HANDLE WinMutexThread::m_mutexHandle = nullptr;
int number = 0;

void WinMutexThread::run(void)
{
	while (1)
	{
		if (::WaitForSingleObject(m_mutexHandle, INFINITE) == WAIT_OBJECT_0)
		{
			std::cout << "Current Thread: " << ::GetCurrentThreadId() \
			          << ", Value: " << number++ << std::endl;

			::ReleaseMutex(m_mutexHandle);
		}

		Sleep(1000);
	}
}

void WinMutexThread::initMutex(void)
{
	m_mutexHandle = ::CreateMutex(nullptr, FALSE, nullptr);
}

実行()関数では、我々は単にミューテックス、スレッドIDを要求し、1だけインクリメントされ、印刷やグローバル変数を作ります

コール

int main(int argc, char** argv)
{
	// 创建互斥锁
	WinMutexThread::initMutex();

	// 创建三个线程
	WinMutexThread thread1;
	WinMutexThread thread2;
	WinMutexThread thread3;
	// 开启线程
	thread1.start();
	thread2.start();
	thread3.start();
	// 等待
	thread1.wait();
	thread2.wait();
	thread3.wait();

	system("pause");
	return 0;
}

运行结果如下:
現在のスレッド:12632、値:0
現在のスレッド:13096、値:1
現在のスレッド:18652、値:2
現在のスレッド:12632、値:3
現在のスレッド:13096、値:4
現在のスレッド:18652、値:5
現在のスレッド:12632、値:6
現在のスレッド:13096、値:7
現在のスレッド:18652、値:8
現在のスレッド:12632、値:9
現在のスレッド:13096、値:10
現在のスレッド:18652、値:11


著者:douzhq
個人ブログホームページ:紙飛行機飛んでいない
記事同期ページ(現在は完全なコード)を相互に排他的なスレッドや同期(3) - Windowsのミューテックス

发布了90 篇原创文章 · 获赞 81 · 访问量 5万+

おすすめ

転載: blog.csdn.net/douzhq/article/details/104351363