IPC之进程间互斥

来源:互联网 发布:网络炒汇合法吗 编辑:程序博客网 时间:2024/05/10 12:29
对于互斥对象的操作包括:
(1)创建互斥对象(CreateMutex)
CreateMutex函数
功能: 创建互斥量来确保一个线程独占对一个资源的访问。互斥量对象包含一个使用计数、线程ID
以及一个递归计数。线程ID用来标识当前占用这个互斥量的是系统中的那个线程,递归计数
表示这个线程占用该互斥量的次数。互斥量可以确保正在访问内存块中的任何线程会独占对
内存块的访问权,这样就维护了数据的完整性。
原型:
HANDLE CreateMutex(
LPSECURITY_ATTRIBUTESlpMutexAttributes,// 指向安全属性的指针
BOOL bInitialOwner,// 初始化互斥对象的所有者
LPCTSTR lpName // 指向互斥对象名的指针
);
参数:
bInitialOwner:用来控制互斥量的初始状态,如果传的是FALSE(通常情况),那么互斥量对象的线程ID和递归计数都将被设置为0,这意味着互斥量不为任何线程占用,因此处于触发状态。如果传入的是TRUE,那么对象的线程ID将被设为调用线程的线程ID,递归计数将被设为1,由于线程ID为非0值,因此互斥量处于未触发状态。

备注:

假设线程试图等待一个未触发的互斥量对象。在这种情况下,线程通常会进入等待状态。但是,线程会检查想要的互斥量的线程ID与互斥量内部记录的线程ID是否相同。如果一致,那么线程将保持可调度状态--即使该互斥量没被触发。每次线程成功等待了一个互斥量,互斥量对象的递归计数会递增。使递归计数大于1的唯一途径就是利用这个例外。


(2)打开互斥对象(OpenMutex)
     OpenMutex函数
功能:打开一个互斥量对象
函数原型:
HANDLE OpenMutex(
DWORD dwDesiredAccess,// 打开方式
BOOL bInheritHandle,// 如希望子进程能够继承句柄,则为TRUE

LPCTSTRlpName// 指向互斥对象名的指针

);


参数:
dwDesiredAccess取值如下:
MUTEX_ALL_ACCESS请求对互斥体的完全访问
MUTEX_MODIFY_STATE允许使用 ReleaseMutex 函数
SYNCHRONIZE 允许互斥体对象同步使用


(3)释放互斥对象(ReleaseMutex)
   ReleaseMutex函数
功能:释放互斥量
原型:
HANDLE ReleaseMutex(
HANDLE hMutex
)
备注:这个函数会将对象的递归计数减1,。如果线程成功的等待了互斥量对象不止一次,那么线程

必须调用该函数相同次数,才能将递归计数变成0.

下面是互斥对象实际应用的实例:

1)对CreateMutex函数的使用#include <Windows.h>#include <stdio.h>#define MUTEXNUME"test"//互斥对象的名字int main(){HANDLE hMutex = NULL;hMutex = CreateMutex(NULL,FALSE,MUTEXNUME);//创建一个命名互斥对象while (1){WaitForSingleObject(hMutex,INFINITE);//等待互斥量被触发,等待到后,把线程ID设置为被调用线程的线程ID,将递归计数设置为1,互斥量变成未触发状态printf("123456789\n");ReleaseMutex(hMutex);//释放互斥量,将递归计数设置为0,互斥量被触发,调用等待的其他线程Sleep(100);}getchar();return 0;}2)对OpenMutex函数的使用#include <Windows.h>#include <stdio.h>#define MUTEXNUME"test"//互斥对象的名字int main(){HANDLE hMutex = NULL;hMutex = OpenMutex(MUTEX_ALL_ACCESS,FALSE,MUTEXNUME);//打开内核对象中,名字为test的互斥内核对象while (1){WaitForSingleObject(hMutex,INFINITE);//等待互斥量被触发,等待到后,把线程ID设置为被调用线程的线程ID,将递归计数设置为1,互斥量变成未触发状态printf("987654321\n");ReleaseMutex(hMutex);//释放互斥量,将递归计数设置为0,互斥量被触发,调用等待的其他线程Sleep(100);}getchar();return 0;}


0 0
原创粉丝点击