mutexロック/ミューテックスは何ですか?
プログラミングでは、ミューテックスオブジェクトの概念は、共有データ操作の整合性を確保することです。選択された、マーカーの各オブジェクトが対応する「は、相互排他ロック」と呼ばれることができ、このタグは、オブジェクトにアクセスするためのいずれかの時間、唯一のスレッドでいることを保証するために使用されている-ミューテックスBaiduの百科事典。
ミューテックスにアクセスするための唯一のスレッド、他のスレッド要求された場合は、ミューテックスを占有し、ロック要求スレッドが中断されていること。ロック所有者は、スレッドがミューテックスを所有しているロックするミューテックス、CPUスケジューリング要求を解放するまで、スレッドが起こされます。
次のようにミューテックスのWindowsに関連した機能は次のとおりです。
- CreateCreateMutex(LPSECURITY_ATTRIBUTES lpMutexAttributes、BOOL bInitialOwner、LPCWSTR lpName); //ミューテックスを作成します。
- WaitForSingleObject(HANDLE hHandle、dwMilliseconds DWORD); //ウェイト要求は、ミューテックスを占めています
- ReleaseMutex(HANDLEのhMutex); //ミューテックスを解放
- CreateCreateMutexの機能、ミューテックスの作成を表し、
- パラメータlpMutexAttributes:急行セキュリティプロパティ、通常に設定nullptrは、デフォルトのセキュリティ属性を示します。
- パラメータbInitialOwnerは:すぐに作成されたミューテックスを所有した後、あるかどうかを示しTRUEが、それはすぐに持っていることを示し、FALSEは、彼らはすぐに持っていなかったと述べました。
- パラメータlpNameは:名前のミューテックスを示します。あなたは、名前のミューテックスを設定し、または別のスレッド間で共有することができます名前で、あなたは明確な証拠を設定しない場合に設定することができnullptr。
- 戻り値:成功したリターンミューテックスハンドル。リターンに失敗nullptr。
- WaitForSingleObject機能、ミューテックス待ち要求を占め表します。
- パラメータhHandle:ハンドル。この関数は、要求ミューテックスないだけに使用することができ、それはまた、スレッドの終了処理を待っているように、使用することができ、セマフォ、ミューテックスの所有、及び信号待ち待っ。
- パラメータdwMilliseconds:ミリ秒数を示します。設定INFINITEは無期限に待機表します。
- 戻り値:
返却値 | 説明 |
---|---|
WAIT_FAILED | これは、関数を表すのWaitForSingleObject呼び出しが失敗し、あなたが機能する)のGetLastErrorを(エラーコードを取得するには |
WAIT_OBJECT_0 | セットターゲットに成功するまで待ち |
WAIT_TIMEOUT | これは、タイムアウトを待って表し |
WAIT_ABANDONED | 対象ミューテックス場合は、スレッドがミューテックスオブジェクトを保持している表しは終了しましたが、ミューテックスを解放しませんでした。今回は、オブジェクトがミューテックスの状態を放棄しています。挙動は不明であるが、推奨されません |
- 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のミューテックス