Mutex互斥量也是一个内核对象,用来确保每个线程独占一个资源的访问,互斥量与临界区相似,但互斥量可以用于不同进程间的线程互访资源。
主要用到四个函数:
创建互斥量(注意与事件Event的创建函数对比)
函数原型:
HANDLE CreateMutex(
LPSECURITY_ATTRIBUTES lpMutexAttributes,
BOOL bInitialOwner,
LPCTSTR lpName
);
函数说明:
第一个参数表示安全控制,一般直接传入NULL。
第二个参数用来确定互斥量的初始拥有者。如果传入TRUE表示互斥量对象内部会记录创建它的线程的线程ID号并将递归计数设置为1,由于该线程ID非零,所以互斥量处于未触发状态。如果传入FALSE,那么互斥量对象内部的线程ID号将设置为NULL,递归计数设置为0,这意味互斥量不为任何线程占用,处于触发状态。
第三个参数用来设置互斥量的名称,在多个进程中的线程就是通过名称来确保它们访问的是同一个互斥量。
成功返回一个表示互斥量的句柄,失败返回NULL。
打开互斥量
函数原型:
HANDLE OpenMutex(
DWORD dwDesiredAccess,
BOOL bInheritHandle,
LPCTSTR lpName //名称
);
函数说明:
第一个参数表示访问权限,对互斥量一般传入MUTEX_ALL_ACCESS。
第二个参数表示互斥量句柄继承性,一般传入TRUE即可。
第三个参数表示名称。某一个进程中的线程创建互斥量后,其它进程中的线程就可以通过这个函数来找到这个互斥量。
成功返回一个表示互斥量的句柄,失败返回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");
}
分享到:
相关推荐
多线程中互斥量的使用。 涉及到得知识有:线程的创建、互斥量的创建和使用,线程等待等。
c++多线程库的使用demo,介绍了互斥库 mutex的使用方式
c: 多线程访问同一资源 d: 经典线程同步互斥问题 e: 使用关键段解决子线程互斥问题 f: 利用事件实现线程同步问题 g: 利用互斥量来解决线程同步互斥问题 h: problem1 生产者消费者问题 (1生产者 1消费者 1...
C++11多线程编程.zip 代码实例 C++11多线程编程future其他成员函数、shared_future、atomic ...C++11多线程编程windows临界区、其他各种mutex互斥量 C++11多线程编程补充知识、线程池浅谈、数量谈、总结
使用多线程进行串口编程,获取串口数据,利用互斥锁和信号量在不同的线程中安全地操作数据,希望该demo能帮助你快速理解并掌握上述知识。
lock_guard 对象通常用于管理某个锁(Lock)对象,因此与 Mutex RAII 相关,方便线程对互斥量上锁,即在某个 lock_guard 对象的声明周期内,它所管理的锁对象会一直保持上锁状态;而 lock_guard 的生命周期结束之后,...
VC如何使用互斥量创建进程,教你如何使用互斥量,新手学习可下载参考.VC如何使用互斥量创建进程,教你如何使用互斥量,新手学习可下载参考.
介绍各种线程同步技术 包含多线程互斥量同步 信号量同步 事件同步 等多种多线程编程代码
用C++实现多线程间的同步和互斥,模拟读者、写者问题,支持一个读者一个写者、多个读者一个写者以及多个读者多个写者间的同步和互斥。
文件读取进度条的实现可以有很多种方法,常用的是在读取文件的过程中 隔一定时间向对话框发送消息以控制进度条的位置,但是这种方法很难确定隔多 少时问发送一个消息,因为文件的大小是不确定的,时间间隔长了可能文件...
多任务编程超入门-(8) 递归互斥量 示例工程,代码
通过原子操作、线程同步如互斥锁、读写锁、条件变量、信号量等方法解决C++线程安全问题。同时介绍了线程安全的单例,饿汉模式和懒汉模式。对于C++智能指针作出了简要介绍。同时整理了相关的例子帮助理解。适用人群:...
利用多线程原理模拟生产与消费的互斥同步过程,使用了信号量
使学生能够从程序设计的角度了解多线程程序设计的方法和在windows系统下多线程同步互斥的机制。 2、实验内容 理解Windows程序设计的基本思想,理解基于消息的程序设计方法,设计出简单的基于事件的windows程序,完成...
Solaris2.4多线程编程,描写互斥、条件变量、信号量的使用
那在Qt里面,由于Qt本身使用的是C++实现的,在支持C++的前提下,Qt还有自己创建多线程的方式,用得最多的主要有如下两种方式: 1、重写run函数来实现 2、使用moveToThread函数 参考帖子:...
一个课程实验,使用c/c++,多线程同步(使用的互斥量)实现哲学家思考问题的gui演示,比较简单,直接导入vs就可以运行了
《Linux多线程服务端编程:使用muduo C++网络库》主要讲述采用现代C++在x86-64 Linux上编写多线程TCP网络服务程序的主流常规技术,重点讲解一种适应性较强的多线程服务器的编程模型,即one loop per thread。...
实现了传入string格式的js到jerryscript中执行,实现了多线程的互斥锁,保证多线程访问的安全,并且js方法中使用多个c++map格式的参数为入参,返回值为bool.方法定义如下: static bool runJsEngine(const map, string> ...
线程同步(4种方法).rar 互斥,信号量,事件