线程控制

2023-11-01



1. 线程相关函数:
    1.1 CreateThread:windows系统函数
          _beginthread:C/C++运行库提供的创建线程函数,如果要在多线程中使用C/C++运行库,需要使用该函数进行创建线程,该函数内部会初始化某些C运行时变量,并在内部调用CreateThread,里面会分配一个对象空间,用于保证c运行库部分接口的线程安全(如错误码),所以建议使用_beginthread创建线程
    1.2 ExitThread:
         _endthread:与_beginThread对应,如果使用_beginThread创建线程,但是使用ExitThread,就会出现内存泄露
    1.3 TerminateThread:终止线程。线程外终止线程,如果是线程内终止线程,就是上面的ExitThread,_endthread。不过这几种方式都不建议使用,应该等线程执行完后自动结束
    1.4 ResumeThread:恢复线程,恢复与挂起的次数需要相同才能唤醒
    1.5 SuspendThread:挂起线程
    1.6 SetThreadPriority:设置线程优先级
    1.7 Sleep:睡眠,SleepEx:会有一个参数设置(bAlertable),其它有些API也有类似这个参数,这个参数设置为True,表示如果有异步IO这种回调过来,SleepEx就会提前结束了,如果是False,则和以前Sleep行为一致
    1.8 GetThreadPriority:获取线程优先级
    1.9 GetExitCodeThread:获取线程退出码,可以通过不断调用这个函数,判断出线程是否结束,如果返回STILL_ACTIVE表示线程正在执行,如果CreateThread时,传入的flag是延迟启动,获取到ExitCode也依旧是STILL_ACTIVE
2. 线程通信:
四种进程或线程同步互斥的控制方法
1、临界区:通过对多线程的串行化来访问公共资源或一段代码,速度快,适合控制数据访问。
2、互斥量:为协调共同对一个共享资源的单独访问而设计的。
3、信号量:为控制一个具有有限数量用户资源而设计。
4、事件:用来通知线程有一些事件已发生,从而启动后继任务的开始。

1. 互斥量与临界区的作用非常相似,但互斥量是可以命名的,也就是说它可以跨越进程使用。所以创建互斥量需要的资源更多,所以如果只为了在进程内部使用的话临界区会带来速度上的优势并能够减少资源占用量 。因为互斥量是跨进程的互斥量一旦被创建,就可以通过名字打开它。
2. 互斥量(Mutex),信号灯(Semaphore),事件(Event)都可以被跨越进程使用来进行同步数据操作,而其他的对象与数据同步操作无关,但对于进程和线程来讲,如果进程和线程在运行状态则为无信号状态,在退出后为有信号状态。所以可以使用WaitForSingleObject来等待进程和 线程退出。
3. 通过互斥量可以指定资源被独占的方式使用,但如果有下面一种情况通过互斥量就无法处理,比如现在一位用户购买了一份三个并发访问许可的数据库系统,可以根据用户购买的访问许可数量来决定有多少个线程/进程能同时进行数据库操作,这时候如果利用互斥量就没有办法完成这个要求,信号灯对象可以说是一种资源计数器。

    2.1 事件(Event)
          CreateEvent, SetEvent,ResetEvent,OpenEvent
          (1)如果是跨进程访问事件,则需要对事件命名。
          (2)事件是否要自动恢复
          (3)事件的初始状态设置
    2.2 信号量(semaphore)
          CreateSemaphore,ReleaseSemaphore,OpenSemaphore.
    2.3 互斥量(mutex)
          CreateMutex,OpenMutex,ReleaseMutex.
    2.4 临界区(Critical section):临界区不支持垮进程访问。
          InitializeCriticalSection,DeleteCriticalSection,EnterCriticalSection,LeaveCriticalSection
          (1)每个共享资源使用一个CRITICAL_SECTION变量
          (2)不要长时间运行关键代码段。
          (3)如果需要同时访问多个资源,则可以连续调用EnterCriticalSection
          (4)Critical Section不是os核心对象,如果进入临界区的线程挂了,将无法释放临界资源,这个缺点在Mutex中得到弥补。
    2.5 等待核心对象
        WaitForSingleObject
        WaitForMultipleObjects


代码如下

SECTION("CreateThread")
    {

        // c++11写法,分配默认堆栈大小
        std::thread t1 = thread(TestStdThread);
        t1.detach();

        unsigned int thread_id = 0;
        auto thread_handle = _beginthreadex(nullptr, 0, BeginThreadFunc, (LPVOID)1, 0, &thread_id);

        // 通过waitfor等待线程结束
        if (WAIT_OBJECT_0 == WaitForSingleObject((HANDLE)thread_handle, 1000))
        {
            cout << "wait success" << endl;
        }
        else
        {
            cout << "wait time out" << endl;
        }

        // 通过GetExitCode等待线程结束
        DWORD exitCode1 = 0;
        GetExitCodeThread((HANDLE)thread_handle, &exitCode1);
        while (exitCode1 == STILL_ACTIVE)
        {
            GetExitCodeThread((HANDLE)thread_handle, &exitCode1);
            puts("Thread 1 is still running!");
            Sleep(1000);
        }
        std::cout << exitCode1;

        TerminateThread((HANDLE)thread_handle, 0); // 可以强制结束线程
        CloseHandle((HANDLE)thread_handle);
    }

    SECTION("CriticalSection")
    {
        // 临界区
        RTL_CRITICAL_SECTION critical_section;
        InitializeCriticalSection(&critical_section);
        EnterCriticalSection(&critical_section);
        LeaveCriticalSection(&critical_section);
        DeleteCriticalSection(&critical_section);
    }

    SECTION("Mutex")
    {
        // 互斥量
        HANDLE h_mutex = CreateMutex(NULL, FALSE, L"test_mutex"); // h_mutex默认是激活状态,没有线程拥有
        HANDLE h_mutex_2 = CreateMutex(NULL, FALSE, L"test_mutex");
        CloseHandle(h_mutex_2);
        if (WAIT_OBJECT_0 == WaitForSingleObject(h_mutex, 3000)) // WaitForSingleObject会将等到的互斥量设置为未激活状态,等到的这个线程拥有它
        {
            ReleaseMutex(h_mutex);
        }
        CloseHandle(h_mutex);
    }

    SECTION("Semaphores")
    {
        // 信号量
        HANDLE h_semaphores = CreateSemaphore(nullptr, 2, 10, nullptr);
        LONG pre_count = 0;
        BOOL ret = ReleaseSemaphore(h_semaphores, 2, &pre_count);
        CHECK(pre_count == 2);

        ret = ReleaseSemaphore(h_semaphores, 2, &pre_count);
        CHECK(pre_count == 4);

        if (WAIT_OBJECT_0 == WaitForSingleObject(h_semaphores, 3000)) // WaitForSingleObject会占用一个信号量
        {
            ret = ReleaseSemaphore(h_semaphores, 2, &pre_count);
            CHECK(pre_count == 5);
        }
        int pre = 0;
    }


    SECTION("Event")
    {
        // 事件
        HANDLE h_event = CreateEvent(nullptr, FALSE, TRUE, NULL);
        // WaitForMultipleObjectsEx
    }


本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

线程控制 的相关文章

  • 泛型使用时遇到的bug

    首先说 这次的bug理解起来很简单 就是泛型被使用时 泛型的类一定要被引用 前提说明 我建了一个保存预下单数据的接口 然后提供一个查询接口 我就想 每次查出来就是json 那每次都要代码里解析 太重复 为什么不做成泛型 查询时候把类型传入
  • 华农oj数据结构——8581

    8581 线性链表逆置 时间限制 1000MS 代码长度限制 10KB 提交次数 2811 通过次数 2032 题型 编程题 语言 G GCC Description 线性链表的基本操作如下 include
  • CTP 4097错误根源 / CTP程序运行没有反应/CTP版本说明

    其实这本是个很简单的错误 但经常看到有人问到 而且网上居然还出了玄学解答 所以干脆单独写一篇解释一下这个错误 这一篇文章同样适用于解决为什么没有OnFrontConnected回调 Decrypt handshake data failed
  • 记录一次 图片边缘色值问题

    texture wrap mode 设置为clamp
  • 你不知道的测试小技巧——postman接口测试导入导出操作详解

    目录 导出 导入 总结 postman中的集合脚本 环境变量 全局变量全部都可以导出 然后分享给团队成员 导出后的脚本可以通过newman生成测试报告 另外还可以将浏览器 抓包工具 接口文档 swagger 中的数据包导入到postman中
  • NeRF原理解析

    文章目录 引言 NeRF资料 技术基础梳理 算法概览 用神经辐射场 Neural Radiance Field 来表示场景 基于辐射场的体素渲染算法 经典体素渲染算法 数值近似的方法 优化神经辐射场 位置信息编码 Positional en
  • PyQt专题结题感言:Python图形用户界面开发

    PyQt专题结题感言 Python图形用户界面开发 在这篇文章中 我将为您介绍PyQt框架 这是一个功能强大的Python图形用户界面 GUI 开发工具 我将详细解释PyQt的基本概念和用法 并提供一些源代码示例来帮助您入门 PyQt是一个
  • 将两个有序数组合并为一个新的有序数组(Java实现)

    不可否认的是Java确实C语言方便许多 这种写法比我在C中的那种写法要好 代码如下 public class Test public static void main String args int arr1 1 3 5 7 9 int a
  • linux 删除的文件太多:bash:/usr/bin/rm: Argument list too long

    背景 删除一个文件夹内指定后缀的文件时 遇到错误 提示 bash usr bin rm Argument list too long 很明显是指定后缀的文件太多 导致无法删除 解决方案 通过命令find来进行删除 比如要删除所有的json文
  • 基于python+flask实现视频数据可视化

    使用爬虫对视频弹幕进行爬取并保存为csv文件 导入数据库中 进而实现前后端交互功能 数据集中包含的数据分别为爬取的热门视频的标题 播放量 弹幕量 收藏量 综合得分以及视频的类别等信息 便于后续我们进行数据分析 我们使用数据库中的数据评出综合
  • 任务分配的穷举法、匈牙利法、分支定界法

    1 必做 任务分配问题 设有 4 项任务 B1 B2 B3 B4 派 4 个人 A1 A2 A3 A4 去完成 每个人都可以承担 4 项任务中的任何一项 但所消耗的资金不同 设 Ai 完成 Bj 所需资金为 问如何分配任务 使总费用最少 假
  • 无缝漫游的过程!

    无缝漫游中无线AP的配置与普通无线AP的配置基本相同 只是应当注意以下几个方面的问题 所有无线AP必须使用同一SSID 所有无线AP必须使用同一网段的IP地址 并且处于同一VLAN中 信号相互覆盖的无线AP不能使用相同的频道 由于多个AP信
  • 图形分析之Nsight的使用

    作者 i dovelemon 日期 2017 06 11 来源 CSDN 主题 Nsight OpenGL 引言 最开始的时候 我进行图形编程使用的是DX 所以那时候进行图形分析的时候 基本都是使用PIX 后来转向了OpenGL 分析的时候
  • JVM-17(垃圾回收器)上

    目录 17 1 GC分类与性能指标 17 1 1 JVM的发展 17 1 2评估GC的性能指标 17 2 不同的垃圾回收器概述 17 3 Serial回收器 串行回收 17 4 ParNew回收器 并行回收 17 5 Parallel回收器
  • html超链接打开共享文件夹,教你如何访问共享文件夹

    现在我们往往要讲究 资源共享 就是有好的东西跟大家一起分享 那么到电脑上呢经常有一些文件夹 有的是加密的 有的是共享的 今天呢小编就要给大家讲讲如何访问这些共享文件夹 要想查看共享文件夹其实也是有步骤可言的 首先 要先打开控制面板 有一个W
  • 电脑开机就显示360服务器,我用360给电脑杀毒,一直到开机启动项会停止,显示“扫面服务意外终止,无法继续扫描,这可能是由于程序...

    希望我的回答可以帮助楼主解决问题哦 这个问题很明显是杀毒软件自身的问题 不太知道诺顿这款杀毒软件 是不是在升级过程中发生什么问题造成的 楼主可以尝试换用腾讯电脑管家 这款杀毒软件在病毒以及木马的查杀方面很权威 很成熟 下面是我总结的电脑容易
  • ZGC收集器介绍

    ZGC收集器 XX UseZGC ZGC是一款JDK 11中新加入的具有实验性质的低延迟垃圾收集器 ZGC可以说源自于是Azul System公司开发的C4 Concurrent Continuously Compacting Collec
  • OK6410矩阵键盘驱动问题解决方案

    在嵌入式系统开发中 矩阵键盘是一种常见的输入设备 OK6410是一款广泛使用的ARM开发板 本文将介绍如何在OK6410开发板上实现矩阵键盘的驱动 硬件连接 首先 我们需要将矩阵键盘与OK6410开发板进行连接 矩阵键盘通常由多个行和列组成
  • ResNet到底在解决一个什么问题呢?

    点击上方 小白学视觉 选择加 星标 或 置顶 重磅干货 第一时间送达 来源 知乎 https www zhihu com question 64494691 文仅交流 侵删 ResNet发布于2015年 目前仍有大量CV任务用其作为back

随机推荐

  • C# 代码转化为Java代码

    http www tangiblesoftwaresolutions com Free Editions html Install Instant C converts VB NET code to C Install Instant VB
  • 史上最全midjourney关键词

    最全midjourney关键词 篇幅太长 文章最后有可编辑版本获取链接 增强图片真实感 清晰度 unreal engine 虚幻引擎 ultra realistic 超真实 photography 摄影图片 detailed 细节 4K 4
  • LaTeX 使用笔记——公式篇

    目录 一 行内公式 二 独立公式 一 行内公式 二 独立公式 一 括号 1 当括号的两边分别位于上下两行公式 且可能出现两个括号大小不一致的情况 例如 使用LaTeX代码 begin aligned dot V k v 1 z k v 1
  • 一次性搞清楚unicode、codepoint、代码点、UTF

    最近在处理字符过滤 重新研究了下字符 unicode和代码点的相关知识 首先要说一下编码的基本知识unicode unicode unicode是计算机科学领域里的一项业界标准 包括字符集 编码方案等 计算机采用八比特一个字节 一个字节最大
  • Python 爬虫获取某贴吧所有成员用户名

    最近想用Python爬虫搞搞百度贴吧的操作 所以我得把原来申请的小号找出来用 有一个小号我忘了具体ID 只记得其中几个字母以及某个加入的贴吧 所以今天就用爬虫来获取C语言贴吧的所有成员 计划很简单 爬百度贴吧的会员页面 把结果存到MySQL
  • FreeMarker模板使用方法讲解

    项目需要 刚接触 正在学习 FreeMarker简介 FreeMarker模板文件主要由如下4个部分组成 1 文本 直接输出的部分 2 注释 lt gt 格式部分 不会输出 3 插值 即 或 格式的部分 将使用数据模型中的部分替代输出 4
  • 深度学习之基于CNN实现汉字版手写数字识别(Chinese-Mnist)

    Mnist数据集是深度学习入门的数据集 昨天发现了Chinese Mnist数据集 与Mnist数据集类似 只不过是汉字数字 例如 一 二 三 等 本次实验利用自己搭建的CNN网络实现Chinese版的手写数字识别 1 导入库 import
  • C++疑难杂症 error LNK2001: 无法解析的外部符号

    问题简述 error LNK2001 无法解析的外部符号 private static int ETH m age m age ETH 0HA 这类问题是我们在编译过程很常见 原因我百度的时候发现也分好几种 有可能是没有包含相应的头文件 也
  • vue 用axios请求接口的使用以及配置

    若依框架前后端分离 用axios请求接口的使用以及配置 首先需要下载安装 cnpm install axios save 安装完成以后进行配置 打开main js import axios from axios Vue prototype
  • .NET静态代码检查工具StyleCop的安装与使用

    最近需要做一个C 项目的代码走查 其中的一项内容就是要用代码的静态分析工具对代码进行检测 我的想法是使用VisualStudio自带的Microsoft托管建议规则外加StyleCop工具检测问题 主要是警告 再对这些问题逐一分析 我使用的
  • cbm+soma+simm ibm的SOA实施方法论

    cbm soma simm ibm的SOA实施方法论http www ibm com developerworks cn webservices 0909 CBM SIMM SOMA soa
  • 如何通过solc编译solidity编写的以太坊智能合约

    solc solidity的编译器 solidity编写的以太坊智能合约可通过命令行编译工具solc来进行编译 成为以太坊虚拟机中的代码 solc编译后最终部署到链上形成我们所见到的各种智能合约 作为一个solidity命令行编译工具 我们
  • 使用chrome开发者工具调试JavaScript代码的三种常用方法

    对 JS 程序的调试 除了在 JS 程序中使用 alert console log 方法跟踪和调试代码外 开发人员也会经常使用一些调试工具 最常用的 JS 调试工具就是一些主流的浏览器的调试工具 如 IE11 浏览器的 开发人员工具 Fir
  • shell的case语句

    case语句格式 vi test sh echo input read num echo the input data is num case num in 1 echo January 双分号结束 2 echo Feburary 5 ec
  • 计算两个整数的乘积——python

    输入两个整数 求它们的乘积 输入格式 输入两个整数a b 输出格式 输出a b c 其中a b是输入的整数 c是a与b的乘积 输入样例 在这里给出一组输入 例如 2 5 输出样例 在这里给出相应的输出 例如 2 5 10 a b input
  • 等保二级-操作系统CentOS加固说明

    文章目录 等保二级加固 操作系统 加固说明 加固脚本 加固结果验证 1Panel安装 等保二级加固 操作系统 加固说明 注释账户 lp sync shutdown halt news uucp operator games gopher s
  • centos7下对存有服务的硬盘非LVM分区进行扩容

    文章目录 前言背景 一 环境说明 二 操作步骤 1 暂停服务 备份数据 2 卸载硬盘 3 操作硬盘分区所在的硬盘 4 把新建的硬盘分区做成逻辑卷 1 检查是否安装逻辑券软件包 2 建立物理卷 3 建立卷组 4 建立逻辑卷 5 格式化 并 挂
  • 深入理解C语言中的移位运算

    深入理解C语言中的移位运算 移位运算 C语言还提供了一组移位运算 以便向左或者向右移动位模式 对于一个位表示为 xn 1 xn 2 x0 的操作数x C表达式x lt
  • Centos 7 LVM xfs文件系统修复

    情况1 sda Assuming drive cache write through Internal error xfs XFS WANT CORRUPTED GOTO at line 1662 of file fs xfs libxfs
  • 线程控制

    1 线程相关函数 1 1 CreateThread windows系统函数 beginthread C C 运行库提供的创建线程函数 如果要在多线程中使用C C 运行库 需要使用该函数进行创建线程 该函数内部会初始化某些C运行时变量 并在内