天天看點

windows多線程同步機制---互斥量1 互斥量  2 互斥量使用

1 互斥量

    多個線程同時隻能有一個執行.等候到互斥量的線程就擁有了互斥量,線上程釋放該互斥量之前,别的等候該互斥量的線程都不會等候到

  2 互斥量使用

    2.1 建立互斥

      HANDLE CreateMutex(

        LPSECURITY_ATTRIBUTES lpMutexAttributes,

                       //安全屬性

        BOOL bInitialOwner,  

                       //初始化的擁有線程

  LPCTSTR lpName ); //名稱

bInitialOwner - TRUE表示目前建立互斥

量的線程擁有互斥, FALSE為不擁有.

    2.2 等候互斥

       WaitForSingleObject

       WaitForMultipleObjects

    2.3 重置互斥

       ReleaseMutex 

    2.4 關閉互斥

       CloseHandle

    2.5 等候互斥量的線程執行數序

使用互斥線程,按照誰先等候誰先擁有互斥量的規則順序執行.(以後都按這個順序執行)

    2.6 其他函數

      OpenMutex 打開已存在的有名互斥量,傳回互斥量句柄

你想在一個程序中建立了一個有名字的互斥量,想在别的程序中使用這個互斥量的時候,就用此函數指定互斥量名字來得到互斥量的句柄

// Mutex.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include "conio.h"
#include "windows.h"

HANDLE g_hMutex = NULL;

DWORD WINAPI ThreadProc1( LPVOID pParam )
{
	while( 1 )
	{   //等候互斥量
		WaitForSingleObject( g_hMutex,
			INFINITE );
		printf( "ThreadProc1----------\n");
		Sleep( 500 );
		//釋放互斥量
		ReleaseMutex( g_hMutex );
	}
	return 0;
}

DWORD WINAPI ThreadProc2( LPVOID pParam )
{
	while( 1 )
	{	//等候互斥量
		WaitForSingleObject( g_hMutex, 
			INFINITE );
		printf( "------ThreadProc2------\n");
		Sleep( 500 );
		//釋放互斥量
		ReleaseMutex( g_hMutex );
	}
	return 0;
}

DWORD WINAPI ThreadProc3( LPVOID pParam )
{
	while( 1 )
	{	//等候互斥量
		WaitForSingleObject( g_hMutex, 
			INFINITE );
		printf( "------------ThreadProc3\n");
		Sleep( 500 );
		//釋放互斥量
		ReleaseMutex( g_hMutex );
	}
	return 0;
}

void Create( )
{
	DWORD  nThreadID  = 0;
	HANDLE hThread[3] = { NULL };
	hThread[0] = CreateThread( NULL, 0,
		ThreadProc1, NULL, 0, &nThreadID );
	hThread[1] = CreateThread( NULL, 0, 
		ThreadProc2, NULL, 0, &nThreadID );
	hThread[2] = CreateThread( NULL, 0, 
		ThreadProc3, NULL, 0, &nThreadID );
}

int main(int argc, char* argv[])
{	//建立互斥量
	g_hMutex = CreateMutex( NULL,
		FALSE, NULL );

	Create( );

	getch( );
	//關閉
	CloseHandle( g_hMutex );

	return 0;
}
           

繼續閱讀