• C++多线程同步技巧(四)--- 信号量


    简介

    信号量是维护0到指定最大值之间的同步对象。信号量状态在其计数大于0时是有信号的,而其计数是0时是无信号的。信号量对象在控制上可以支持有限数量共享资源的访问,可以用于线程同步,预防死锁等领域。

    信号量的特点和用途可用下列几句话定义:
    (1)如果当前资源的数量大于0,则信号量有效;
    (2)如果当前资源数量是0,则信号量无效;
    (3)系统决不允许当前资源的数量为负值;
    (4)当前资源数量决不能大于最大资源数量。

    ##代码样例

    ////////////////////////////////
    //
    // FileName : SemaphoreDemo.cpp
    // Creator : PeterZheng
    // Date : 2018/10/24 11:10
    // Comment : The usage of "CreateSemaphore"
    //
    ////////////////////////////////
    
    #pragma once
    
    #include <cstdio>
    #include <iostream>
    #include <cstdlib>
    #include <windows.h>
    
    using namespace std;
    
    DWORD WINAPI Func1(LPVOID lpParam);
    DWORD WINAPI Func2(LPVOID lpParam);
    
    HANDLE hSemaphore = NULL;
    int g_num = 0;
    
    DWORD WINAPI Func1(LPVOID lpParam)
    {
    	while (g_num < 100)
    	{
    		LONG count = 0;
    		WaitForSingleObject(hSemaphore, INFINITE);
    		cout << "Count: " << g_num << endl;
    		g_num++;
    		Sleep(10);
    		ReleaseSemaphore(hSemaphore, 1, &count); // 释放信号量
    	}
    	return 0;
    }
    
    DWORD WINAPI Func2(LPVOID lpParam)
    {
    	while (g_num < 100)
    	{
    		LONG count = 0;
    		WaitForSingleObject(hSemaphore, INFINITE);
    		cout << "Count: " << g_num << endl;
    		g_num++;
    		Sleep(10);
    		ReleaseSemaphore(hSemaphore, 1, &count);
    	}
    	return 0;
    }
    
    int main(void)
    {
    	hSemaphore = CreateSemaphore(NULL, 1, 100, "Sep"); // 创建信号量
    	HANDLE hThread[2] = { 0 };
    	hThread[0] = CreateThread(NULL, 0, Func1, NULL, 0, NULL); // 创建线程1
    	hThread[1] = CreateThread(NULL, 0, Func2, NULL, 0, NULL); // 创建线程2
    	WaitForMultipleObjects(2, hThread, TRUE, INFINITE); // 等待线程执行结束
    	system("pause");
    	return 0;
    }
    
    

    参考文档

    【1】https://blog.csdn.net/s_lisheng/article/details/74278765

  • 相关阅读:
    级数问题
    放苹果
    _WIN32_WINNT not defined错误 解决办法
    日期大写
    金额大写转换
    选择屏幕字段不允许直接输入…
    OO面向对象ALV小测试
    判断是否有人在操作某张表,并获取…
    屏幕中设置焦点
    前导零
  • 原文地址:https://www.cnblogs.com/csnd/p/12896993.html
Copyright © 2020-2023  润新知