多线程-互斥变量

第一个 CreateMutex

函数功能:创建互斥量(注意与事件Event的创建函数对比)

函数原型:

HANDLE  CreateMutex(

LPSECURITY_ATTRIBUTESlpMutexAttributes,

BOOLbInitialOwner,

LPCTSTRlpName

);

函数说明:

第一个参数表示安全控制,一般直接传入NULL。

第二个参数用来确定互斥量的初始拥有者。如果传入TRUE表示互斥量对象内部会记录创建它的线程的线程ID号并将递归计数设置为1,由于该线程ID非零,所以互斥量处于未触发状态。如果传入FALSE,那么互斥量对象内部的线程ID号将设置为NULL,递归计数设置为0,这意味互斥量不为任何线程占用,处于触发状态。

第三个参数用来设置互斥量的名称,在多个进程中的线程就是通过名称来确保它们访问的是同一个互斥量。

函数访问值:

成功返回一个表示互斥量的句柄,失败返回NULL。

第二个打开互斥量

函数原型:

HANDLE OpenMutex(

DWORDdwDesiredAccess,

BOOLbInheritHandle,

LPCTSTRlpName     //名称

);

函数说明:

第一个参数表示访问权限,对互斥量一般传入MUTEX_ALL_ACCESS。详细解释可以查看MSDN文档。

第二个参数表示互斥量句柄继承性,一般传入TRUE即可。

第三个参数表示名称。某一个进程中的线程创建互斥量后,其它进程中的线程就可以通过这个函数来找到这个互斥量。

函数访问值:

成功返回一个表示互斥量的句柄,失败返回NULL。

第三个触发互斥量

函数原型:

BOOL  ReleaseMutex (HANDLEhMutex)

函数说明:

访问互斥资源前应该要调用等待函数,结束访问时就要调用ReleaseMutex()来表示自己已经结束访问,其它线程可以开始访问了。

最后一个清理互斥量

由于互斥量是内核对象,因此使用CloseHandle()就可以(这一点所有内核对象都一样)。

#include<stdio.h>
#include<process.h>
#include<windows.h>
HANDLE hMutex;
int tickets=100;

DWORD WINAPI Fun1(VOID *lp)
{
	while(true)
	{
        WaitForSingleObject(hMutex,INFINITE);
		if(tickets>0)
		{
			printf("thread1 %d\n",tickets--);
			ReleaseMutex(hMutex);
		}
		else
		{
			ReleaseMutex(hMutex);
			break;
		}
	}
	return 0;
}

DWORD WINAPI Fun2(VOID *lp)
{
	while(true)
	{
       WaitForSingleObject(hMutex,INFINITE);
	   if(tickets>0)
	   {
		   printf("thread2 %d\n",tickets--);
		   ReleaseMutex(hMutex);
	   }
	   else
	   {
		   ReleaseMutex(hMutex);
		   break;
	   }
	}
	return 0;
}

int main()
{
	hMutex=CreateMutex(NULL,FALSE,NULL);

	HANDLE handle1=CreateThread(NULL,0,Fun1,NULL,0,NULL);
	HANDLE handle2=CreateThread(NULL,0,Fun2,NULL,0,NULL);
	CloseHandle(handle1);
	CloseHandle(handle2);
    Sleep(3000);
	CloseHandle(hMutex);
	return 0;
}

参考:http://blog.csdn.net/morewindows/article/details/7470936

时间: 2024-10-10 21:42:15

多线程-互斥变量的相关文章

pthread_cond_wait和pthread_cond_signal以及互斥变量的使用情况

#include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <pthread.h> #define BUFFER_SIZE 21 //初始化存储空间的大小 #define END_FLAG (-1)//用于退出循环 struct Products { int buffer[BUFFER_SIZE];//存储空间 pthread_mutex_t locker; //声明互斥变量 pth

【转】Linux平台上用C++实现多线程互斥锁

原作者:chexlong 原文地址:http://blog.csdn.net/chexlong/article/details/7058283 在上篇用C++实现了Win32平台上的多线程互斥锁,这次写个Linux平台上的,同样参考了开源项目C++ Sockets的代码,在此对这些给开源项目做出贡献的斗士们表示感谢! 下边分别是互斥锁类和测试代码,已经在Fedora 13虚拟机上测试通过. Lock.h [cpp] view plaincopy #ifndef _Lock_H #define _

linux多线程-互斥&amp;条件变量与同步

多线程代码问题描述 我们都知道,进程是操作系统对运行程序资源分配的基本单位,而线程是程序逻辑,调用的基本单位.在多线程的程序中,多个线程共享临界区资源,那么就会有问题: 比如 #include <pthread.h> #include <unistd.h> #include <stdio.h> #include <stdlib.h> int g_val = 10; void * test1(void* args) { g_val = 20; printf(&

笔记3 linux 多线程 条件变量+互斥锁

//cond lock #include<stdio.h> #include<unistd.h> #include<pthread.h> struct test { char a[10]; char b[10]; char c[10]; }yb = {"111","222","33333"}; static int j=0; pthread_mutex_t mutex_1 = PTHREAD_MUTEX_INI

C++多线程条件变量

C++多线程中的条件变量的使用. 在多线程编程中,常常使用条件变量来等待某个事件的发生. 先看代码 1 #include <thread> 2 #include <mutex> 3 #include <condition_variable> 4 #include <list> 5 #include <string> 6 #include <iostream> 7 #include <chrono> 8 9 class Ev

(转载)Linux 多线程条件变量同步

条件变量是线程同步的另一种方式,实际上,条件变量是信号量的底层实现,这也就意味着,使用条件变量可以拥有更大的自由度,同时也就需要更加小心的进行同步操作.条件变量使用的条件本身是需要使用互斥量进行保护的,线程在改变条件状态之前必须首先锁住互斥量,其他线程在获得互斥量之前不会察觉到这种改变,因为互斥量必须在锁定之后才能计算条件. 模型 #include<pthread.h> pthread_cond_t cond //准备条件变量 pthread_cond_t cond = PTHREAD_CON

多线程互斥--mutex

多线程之线程同步Mutex (功能与Critial Sections相同,但是属于内核对象,访问速度较慢,可以被不同进程调用) 一 Mutex 互斥对象(mutex)内核对象能够确保线程拥有对单个资源的互斥访问权.实际上互斥对象是因此而得名的.互斥对象包含一个使用数量,一个线程ID和一个递归计数器. 互斥对象的行为特性与关键代码段相同,但是互斥对象属于内核对象,而关键代码段则属于用户方式对象.这意味着互斥对象的运行速度比关键代码段要慢.但是这也意味着不同进程中的多个线程能够访问单个互斥对象,并且

多线程之间变量锁的实现

在C#中应用多线程时,经常需要给变量进行加锁,来防止程序的混乱.接下来就是对两个线程中的变量进行加锁的小程序. 1 public partial class Form1 : Form 2 { 3 string a = ""; 4 static object locker = new object(); 5 public Form1() 6 { 7 InitializeComponent(); 8 } 9 10 private void button1_Click(object send

[转] 多线程下变量-gcc原子操作 __sync_fetch_and_add等

http://blog.sina.com.cn/s/blog_6f5b220601013zw3.html 非常好的原子操作,不用加锁:__sync_fetch_and_add GCC 提供的原子操作 gcc从4.1.2提供了__sync_*系列的built-in函数,用于提供加减和逻辑运算的原子操作. 其声明如下: type __sync_fetch_and_add (type *ptr, type value, ...) type __sync_fetch_and_sub (type *ptr