016 Event互斥体 8

●  CreateMutex

  函数原型

1 HANDLE WINAPI CreateMutex(
2   _In_opt_ LPSECURITY_ATTRIBUTES lpMutexAttributes,
3   _In_     BOOL                  bInitialOwner,
4   _In_opt_ LPCTSTR               lpName
5 );

  ○ 参数1:lpMutexAttributes [in, optional]
    指向SECURITY_ATTRIBUTES结构的指针。如果此参数为NULL,则处理不能由子进程继承。

  ○ 参数2:bInitialOwner [in]
    如果此值为真,且调用者创建互斥对象,则调用线程获得互斥对象的初始所有权。否则,调用线程不获取互斥对象的所有权。要确定调用者是否创建互斥对象,请参见返回值部分。

  ○ 参数3:lpName [in, optional]
    互斥对象的名称。名称仅限于MAX_PATH字符。名称比较是区分大小写的。

  ○ Return value返回值
    如果函数成功,返回值就是新创建的互斥对象的句柄。
    如果函数失败,返回值为NULL。要得到扩展的错误信息,请调用GetLastError。

●  ReleaseMutex

  函数原型

1 BOOL WINAPI ReleaseMutex(
2   _In_ HANDLE hMutex
3 );

  ○ 参数1:hMutex [in]
    一个对互斥对象的句柄。CreateMutex或OpenMutex函数返回这个句柄。  

  ○ Return value返回值
    如果函数成功,返回值为非零。
    如果函数失败,返回值为零。要得到扩展的错误信息,请调用GetLastError。

 1 #define UNICODE
 2 #include <stdio.h>
 3 #include <process.h>
 4 #include <windows.h>
 5 //互斥体            关键段 -> 线程同步
 6 //每个互斥体保存了一个线程ID ->
 7 //线程 ID -> 非0(无信号) 0(有信号)
 8 int main()
 9 {
10     HANDLE hMuex = CreateMutex( nullptr, TRUE, nullptr);
11     //无论Wait都是有信号    //如果像要别的线程使用到就需要释放 ReleaseMutes(hMuex);
12     WaitForSingleObjct(hMutex, INFINITE);
13     WaitForSingleObjct(hMutex, INFINITE);
14     WaitForSingleObjct(hMutex, INFINITE);
15     WaitForSingleObjct(hMutex, INFINITE);
16     WaitForSingleObjct(hMutex, INFINITE);
17
18     return 0;
19 }
 1 #define UNICODE
 2 #include <stdio.h>
 3 #include <process.h>
 4 #include <windows.h>
 5 //互斥体            关键段 -> 线程同步
 6 //每个互斥体保存了一个线程ID ->
 7 //线程 ID -> 非0(无信号) 0(有信号)
 8 HANDLE gMutex;
 9 unsigned __stdcall ThreadFunc(void* lParam)
10 {
11     WaitForSingleObjct(gMutex, INFINITE);
12     return 0;
13 }
14 int main()
15 {
16     gMutex = CreateMutex( nullptr, TRUE, nullptr);
17     HANDLE hThread = (HANDLE)__beginthreadex(nullptr, 0, ThreadFunc, nullptr, 0, nullptr);
18     WaitForSingleObject(hThread, INFINITE);
19     //无论Wait都是有信号的
20
21     return 0;
22 }
 1 #define UNICODE
 2 #include <stdio.h>
 3 #include <process.h>
 4 #include <windows.h>
 5 //互斥体            关键段 -> 线程同步
 6 //每个互斥体保存了一个线程ID ->
 7 //线程 ID -> 非0(无信号) 0(有信号)
 8 HANDLE gMutex;
 9 unsigned __stdcall ThreadFunc(void* lParam)
10 {
11     WaitForSingleObjct(gMutex, INFINITE);
12     return 0;
13 }
14 int main()
15 {
16     gMutex = CreateMutex( nullptr, TRUE, nullptr);
17     ReleaseMutex(gMutex);
18     HANDLE hThread = (HANDLE)__beginthreadex(nullptr, 0, ThreadFunc, nullptr, 0, nullptr);
19     //ReleaseMutex(gMutex);
20     WaitForSingleObject(hThread, INFINITE);
21     //无论Wait都是有信号的
22
23     return 0;
24 }
时间: 2024-10-05 18:06:51

016 Event互斥体 8的相关文章

[转载] 《重要》内核下各种同步处理方法(自旋锁、信号灯、互斥体…)

本文转载自: http://www.blogfshare.com/kernel-synchronization.html 1.在支持多线程的操作系统下,有些函数会出现不可重入的现象.所谓“可重入”是指函数的执行结果不和执行顺序有关.反之如果执行结果和执行顺序有关,则称这个函数是“不可重入”的. 2.Windows将中断的概念进行了扩展,提出一个中断请求级(IRQL)的概念.其中规定了32个中断请求级别,分别是0~2级别为软件中断,3~31级为硬件中断,其中数字从0~31,优先级别逐次递增. 在内

信号量、互斥体和自旋锁小结

概述 linuxn内核同步机制几种常用的方式,面试经常会被问道,这里做一个小结 [1]信号量 [2]互斥体 [3]自旋锁 [4]区别 1.信号量(semaphore) 又称为信号灯,本质上,信号量是一个计数器,用来记录对某个共享资源的存取情况,一般共享资源通过以下步骤 (1) 测试控制该资源的信号量(n). (2) 若此信号量的值为正,则允许进行使用该资源.进程将信号量减1. (3) 若此信号量为0,则该资源目前不可用,进程进入睡眠状态,直至信号量值大于0,进程被唤醒,转入步骤(1). (4)

同步 互斥体和信号量

1.互斥体和信号量都是为了实现同步,但是二者解决的问题不一样,也就是说应用场景不一样. 2.互斥体通过加锁,对于共享的资源,大家排队,依次去访问,一个一个来.也就是说,任何时刻只有一个线程访问,其他的线程等待. 3.互斥体加锁存在的问题:无法控制线程的访问顺序.考虑两个线程A,B,访问顺序可能是A-B,也可能是B-A,就要看谁先加锁. 4.考虑下面的场景,生产者/消费者模式,假定A是生产者,B是消费者,生产一个,消费一个,循环下去,这样就要求访问顺序必须是A-B-A-B... 5.怎么解决这个问

linux驱动之 信号量 自旋锁 互斥体

原子操作 原子操作就是单位操作,也就是说操作过程不能被中断 下面代码中每条语句看起来是原子操作,其实不是原子操作: int main(0 { int i=2;//两天汇编语句组成 i=i+3;//三条汇编语句组成 } 实现原子操作方法; 1  自旋锁 自旋锁它是为为实现保护共享资源而提出一种锁机制.其实,自旋锁与互斥锁比较类似 ,它们都是为了解决对某项资源的互斥使用.无论是互斥锁,还是自旋锁,在任何时刻,最多只能有一个保持者,也就说,在任何时刻最多只能有一个执行单元获得锁.但是两者在调度机制上略

信号量、互斥体和自旋锁

http://www.cnblogs.com/biyeymyhjob/archive/2012/07/21/2602015.html 信号量.互斥体和自旋锁 一.信号量 信号量又称为信号灯,它是用来协调不同进程间的数据对象的,而最主要的应用是共享内存方式的进程间通信.本质上,信号量是一个计数器,它用来记录对某个资源(如共享内存)的存取状况.一般说来,为了获得共享资源,进程需要执行下列操作:  (1) 测试控制该资源的信号量.  (2) 若此信号量的值为正,则允许进行使用该资源.进程将信号量减1.

互斥体与互锁 &lt;第五篇&gt;

互斥体实现了“互相排斥”(mutual exclusion)同步的简单形式(所以名为互斥体(mutex)).互斥体禁止多个线程同时进入受保护的代码“临界区”.因此,在任意时刻,只有一个线程被允许进入这样的代码保护区. 任何线程在进入临界区之前,必须获取(acquire)与此区域相关联的互斥体的所有权.如果已有另一线程拥有了临界区的互斥体,其他线程就不能再进入其中.这些线程必须等待,直到当前的属主线程释放(release)该互斥体.什么时候需要使用互斥体呢?互斥体用于保护共享的易变代码,也就是,全

C#互斥体——Mutex

Mutex对象是一个同步基元,可以用来做线程间的同步. 若多个线程需要共享一个资源,可以在这些线程中使用Mutex同步基元.当某一个线程占用Mutex对象时,其他也需要占用Mutex的线程将处于挂起状态. 示例代码: using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading; using System.Threading.Tasks; n

用户模式同步之互斥体小解

1.互斥体(互斥体类似于同步事件)互斥体可避免多个线程争夺一个资源的问题,多线程环境下,如果一个线程获得互斥体,不释放的话其他的线程就获得不了该资源它与同步事件的区别:是在同一个线程内它可以递归获得互斥体,也就是这个线程获得互斥体后对再次去获得认可不排斥,同步我们显而易见的得知不允许这样他有激发未激发两种状态,记住!!!获得互斥体是未激发状态,释放互斥体是激发状态,他和信号量区别清楚同样使用它首先要初始化;CreateMutex(SECURITY,BOOL(是否被占有),LPCTSTR(name

C++多线程同步技巧(三)--- 互斥体

简介 Windows互斥对象机制. 只有拥有互斥对象的线程才有访问公共资源的权限,因为互斥对象只有一个,所以能保证公共资源不会同时被多个线程访问,在线程同步与保证程序单体运行上都有相当大的用处. 代码样例 //////////////////////////////// // // FileName : MutexDemo.cpp // Creator : PeterZheng // Date : 2018/10/23 21:27 // Comment : The usage of "Creat