C++中Semaphore内核对象用法实例

C++中Semaphore内核对象用法实例

什么是Semaphore对象

Semaphore是一种同步内核对象,用于实现线程或进程之间的同步与互斥。它可以用来限制同时进行某项操作的线程或进程的数量。可以把Semaphore视为一个许可证表。在多任务操作系统中,如果操作系统中有多个线程或进程需要访问共享资源,那么当这些线程或进程数目超过一定限制时,就会发生资源竞争的情况,为了避免这种情况的发生,可以使用Semaphore对象进行同步控制和协调。

Semaphore对象具有两个标准操作:
- Wait():如果许可证表中没有许可证可用,则线程或进程被挂起并等待可用的许可证。否则,从许可证表中取出一个许可证,并继续执行。
- Signal():向许可证表中添加一个许可证,如果有被挂起的线程或进程在等待许可证,那么它们中的一个将被唤醒并收到许可证,否则,许可证将保留在许可证表中,等待下一次被取用。

Semaphore对象通常初始化为一个大于或等于零的整数,表示初始时许可证表中可用的许可证数量。如果Semaphore对象的计数器为0,则所有的Wait操作都会被阻塞,直到调用Signal操作为止。

Semaphore对象的使用方法

Semaphore对象通常包括以下步骤:
1. 创建Semaphore对象:使用CreateSemaphore函数创建一个Semaphore对象,指定其初始计数器、最大计数器、名称等参数。
2. Wait操作:使用WaitForSingleObject或WaitForMultipleObjects函数进行等待操作。
3. Signal操作:使用ReleaseSemaphore函数对Semaphore对象进行信号操作。
4. 关闭Semaphore对象:使用CloseHandle函数关闭Semaphore对象。

下面的示例展示了Semaphore对象的使用方法:

示例一

#include <Windows.h>
#include <iostream>

using namespace std;

int main() {
    HANDLE hSemaphore;
    DWORD dwWaitResult;

    // 创建Semaphore对象
    hSemaphore = CreateSemaphore(NULL, 1, 1, "MySemaphore");

    if (hSemaphore == NULL) {
        cout << "CreateSemaphore error: " << GetLastError() << endl;
        return 1;
    }

    // Wait操作
    dwWaitResult = WaitForSingleObject(hSemaphore, 5000);

    switch (dwWaitResult) {
        case WAIT_OBJECT_0:
            // 获取Semaphore对象成功
            cout << "获取Semaphore对象成功" << endl;
            break;
        case WAIT_TIMEOUT:
            // 超时
            cout << "等待获取Semaphore对象超时" << endl;
            break;
        default:
            // 错误
            cout << "WaitForSingleObject error: " << GetLastError() << endl;
            return 1;
    }

    // Signal操作
    if (!ReleaseSemaphore(hSemaphore, 1, NULL)) {
        cout << "ReleaseSemaphore error: " << GetLastError() << endl;
        return 1;
    }

    // 关闭Semaphore对象
    CloseHandle(hSemaphore);

    return 0;
}

代码中,使用CreateSemaphore函数创建了一个名为"MySemaphore"的Semaphore对象,其初始计数器和最大计数器都为1。使用WaitForSingleObject函数等待Semaphore对象,等待的时间为5秒,如果等待到了可用的许可证,则输出"获取Semaphore对象成功",调用ReleaseSemaphore函数对Semaphore对象进行Signal操作,并最后关闭Semaphore对象。

示例二

#include <Windows.h>
#include <iostream>
#include <vector>
#include <thread>

using namespace std;

HANDLE hSemaphore;
const int nThreadCount = 3;
vector<thread> vecThreads;

void ThreadProc(int nIndex) {
    DWORD dwWaitResult;

    dwWaitResult = WaitForSingleObject(hSemaphore, INFINITE);

    switch (dwWaitResult) {
        case WAIT_OBJECT_0:
            // 获取Semaphore对象成功
            cout << "线程[" << nIndex << "]获取Semaphore对象成功" << endl;
            Sleep(2000);
            break;
        default:
            // 错误
            cout << "WaitForSingleObject error: " << GetLastError() << endl;
    }

    ReleaseSemaphore(hSemaphore, 1, NULL);

    return;
}

int main() {
    int i;

    // 创建Semaphore对象
    hSemaphore = CreateSemaphore(NULL, 2, 2, "MySemaphore");

    if (hSemaphore == NULL) {
        cout << "CreateSemaphore error: " << GetLastError() << endl;
        return 1;
    }

    // 创建线程
    for (i = 0; i < nThreadCount; i++) {
        vecThreads.emplace_back(ThreadProc, i);
    }

    // 等待线程执行完成
    for (auto& thread: vecThreads) {
        thread.join();
    }

    // 关闭Semaphore对象
    CloseHandle(hSemaphore);

    return 0;
}

代码中,使用CreateSemaphore函数创建了一个名为"MySemaphore"的Semaphore对象,其初始计数器和最大计数器都为2。使用CreateThread函数创建了3个线程,线程函数为ThreadProc,该函数等待Semaphore对象,等待时间为无限,如果等待到了可用的许可证,则输出"线程[i]获取Semaphore对象成功",延迟2秒,并调用ReleaseSemaphore函数对Semaphore对象进行Signal操作。最后关闭Semaphore对象。

以上两个示例展示了常规的Semaphore对象使用方法,通过Semaphore对象可以实现线程同步控制和协调等功能,在实际的应用开发中,Semaphore对象的应用非常广泛。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C++中Semaphore内核对象用法实例 - Python技术站

(0)
上一篇 2023年5月22日
下一篇 2023年5月22日

相关文章

  • C++设计模式之享元模式(Flyweight)

    C++设计模式之享元模式(Flyweight)攻略 概述 享元模式是一种结构型设计模式,它的主要目标是减少对象的数量,通过尽可能多的与其他相似对象共享来最小化内存占用和计算量。 在享元模式中,所有共享对象都以一个单一的实例存在于内存中,因此系统需要考虑识别这些对象以便正确地重用已经存在的实例,而不是创建新的对象。具体实现时,享元模式通过将需要重复使用的属性划…

    C 2023年5月22日
    00
  • C语言实现简单的飞机大战游戏

    C语言实现简单的飞机大战游戏攻略 介绍 飞机大战是一款经典的游戏,玩家需要操控战斗机,击败敌人并获得高分。在本文中,我们将使用C语言实现一个简单的飞机大战游戏,让大家学习如何使用C语言实现一个完整的小游戏。 实现步骤 初始化游戏。在开始游戏之前,需要初始化一些游戏参数,比如窗口大小、背景音乐等。 绘制游戏场景。我们使用图形库(比如graphics.h)来绘制…

    C 2023年5月24日
    00
  • C语言的动态内存管理你了解吗

    C语言的动态内存管理是非常重要的知识点,掌握了动态内存管理,可以更好地理解程序的运行过程。下面是动态内存管理的完整攻略: 1. 动态内存分配的概念 动态内存分配是在程序运行时向操作系统申请内存空间,对内存进行分配、释放和管理的过程。与静态内存分配不同,静态内存分配在程序编译时就已经确定了。动态内存分配通常用于需要运行时才完成大小和数量的确定的情况下,例如输入…

    C 2023年5月23日
    00
  • C语言实现访问及查询MySQL数据库的方法

    一、前言 MySQL是目前最流行的开源关系型数据库之一,C语言则是最常用的编程语言之一。通过C语言访问和查询MySQL数据库,能够为我们的项目提供灵活高效的数据支持。本文将详细讲解如何使用C语言来访问及查询MySQL数据库。 二、环境准备 在开始之前,我们需要进行以下准备工作: 安装MySQL数据库。 安装MySQL C API库。我们可以到MySQL官网(…

    C 2023年5月22日
    00
  • 学习C语言的第一天

    今天学习C语言学习了三个部分: 第一个部分是软件环境的搭建,如何搭建一个项目 使用工具:visual studio 2010 搭建过程:新建项目、配置设置(主要是解决运行后一闪而过的问题) 第二部分是编写一个简单的C语言程序代码 #include<stdio.h> //引入头文件 io指的是输入与输出 int main(){ //不可少的入口函数…

    C语言 2023年4月18日
    00
  • 基于C语言实现的贪吃蛇游戏完整实例代码

    “基于C语言实现的贪吃蛇游戏完整实例代码”攻略 1. 总体介绍 该贪吃蛇游戏代码是基于C语言实现的经典小游戏。具体实现方式是控制某一个方向键使蛇移动,每次蛇吃到食物的时候,则身体变长,直到蛇的身体覆盖整个游戏屏幕。此过程中有各种UI,比如分数、游戏结束等。此代码使用的是Windows平台的控制台界面。 2. 代码实现步骤 2.1 游戏的设置 将控制台窗口的大…

    C 2023年5月30日
    00
  • C语言分支和循环详解

    C语言分支和循环详解 本文将详细讲解C语言中的分支和循环结构,并提供两个实例说明。 分支结构 C语言中的分支结构有两种:if…else语句和switch…case语句。 if…else语句 if…else语句用于根据条件执行不同的代码块。其语法如下: if (condition) { // 如果condition为true,则执行这里的代码 …

    C 2023年5月23日
    00
  • Maplesoft Maple 2020官方正式版安装教程图文详细介绍(含下载地址)

    Maplesoft Maple 2020正式版安装教程 本文介绍了Maplesoft Maple 2020正式版的安装方法,包括下载和安装过程。 下载Maple软件 官网下载链接:https://www.maplesoft.com/support/downloads/ 访问上述链接,找到Maple软件的下载链接,选择合适的版本下载。 下载完成后双击安装包,开…

    C 2023年5月22日
    00
合作推广
合作推广
分享本页
返回顶部