多线程小记

2023-11-10

创建线程的几种方法

C++多线程之_beginthread
https://blog.csdn.net/u013043408/article/details/83830181
C++多线程之CreateThread
https://blog.csdn.net/u013043408/article/details/83830598
C++多线程之std::thread
https://blog.csdn.net/u013043408/article/details/83855565

特征

名字 范围 作用对象 特性
原子锁 本进程 互斥变量 windows api
临界区 本进程 互斥代码段 线程拥有权;旋转锁
互斥量 进程间 互斥代码段 线程拥有权;遗弃问题
事件 进程间 同步代码段 自动复位
信号量 进程间 同步代码段(只有1个资源时) 资源计数
读写锁 本进程 互斥代码段 windows api

参考资料:https://blog.csdn.net/morewindows/article/details/17488865

一、原子操作Interlocked

1、头文件 windows.h
2、互斥的对象是一个变量。
3、变量字节对齐?
4、常用接口
【加一,返回Addend+1】
LONG InterlockedIncrement(LONG volatile* Addend);
【减一,返回Addend-1】
LONG InterlockedDecrement(LONG volatile* Addend);
【加n,返回Addend+Value】
LONG InterlockedExchangeAdd(LONG volatile* Addend, LONG Value);
【赋值,返回值为原先的Target,然后Target=Value】
LONG InterlockedExchange(LONG volatile* Target, LONG Value);

二、临界区CS

1、临界区结构体
【OwningThread】拥有临界区的线程。只有拥有者才可以”进入临界区“。当然,其它线程是可以”退出临界区“的(计数-1)。
【RecursionCount】计数。不论哪个线程,进入临界区+1,退出临界区-1(即使是在其它线程退出也-1)。
【LockSemaphore】自复位事件。猜测是,退出临界区时,检查到计数为0,则发送事件,宣布:“这个临界区可以空闲了,谁要使用,先来先得。”。
【SpinCount】旋转锁。一般来说,线程申请拥有临界区使用权失败后,会立即切换到等待状态。等临界区空闲后,才切换到运行状态。而旋转锁的作用是,当申请失败后,线程会继续尝试申请n次。猜想“一个for,循环SpinCount次,申请拥有权”。我们知道,切换线程状态开销较大,如果CPU数量够用,能保证一线程一CPU。那么,子线程完全可以一直死等,直到临界区空闲。而加了旋转锁,在一定程度上避免了线程状态切换,保持线程的连续性。
2、拥有临界区的线程,可以多次进入临界区。但想要归还使用权,则必须进入多少次,就退出多少次。
3、临界区可以解决线程的互斥问题,但因为具有“线程所有权”,所以无法解决同步问题。
4、常用接口
【初始化,定义临界区变量后必须先初始化】
void InitializeCriticalSection(LPCRITICAL_SECTION lpCriticalSection);
BOOL InitializeCriticalSectionAndSpinCount(LPCRITICAL_SECTION lpCriticalSection, DWORD dwSpinCount);
【销毁,用完之后记得销毁】
void DeleteCriticalSection(LPCRITICAL_SECTION lpCriticalSection);
【进入临界区,系统保证各线程互斥的进入临界区】
void EnterCriticalSection(LPCRITICAL_SECTION lpCriticalSection);
【离开临界区】
void LeaveCriticalSection(LPCRITICAL_SECTION lpCriticalSection);
【修改旋转锁】
DWORD SetCriticalSectionSpinCount(LPCRITICAL_SECTION lpCriticalSection, DWORD dwSpinCount);

三、互斥量Mutex

1、互斥量是内核对象,它与临界区都有“线程所有权”,所以不能用于线程的同步。
2、互斥量能够用于多个进程之间线程互斥问题,并且能完美的解决某线程意外终止所造成的“遗弃”问题。
3、常用接口
【创建】HANDLE CreateMutex(lpMutexAttributes,bInitialOwner,lpName);
【打开】HANDLE OpenMutex(dwDesiredAccess,bInheritHandle,lpName);
【释放】BOOL ReleaseMutex(hMutex);
【关闭】CloseHandle(hEvent);

四、事件

1、事件是内核对象,分为手动置位事件和自动置位事件。事件Event内部它包含一个使用计数(所有内核对象都有),一个布尔值表示是手动置位事件还是自动置位事件,另一个布尔值用来表示事件有无触发。
2、事件可以由SetEvent()来触发,由ResetEvent()来设成未触发。还可以由PulseEvent()来发出一个事件脉冲。
3、事件可以解决进程间同步问题,因此也能解决互斥问题。
4、事件没有“线程所有权”,所以连续两次等待同一个事件,第二个会等待超时。
4、常用接口
【创建】HANDLE CreateEvent(lpEventAttributes,bManualReset,bInitialState,lpName);
【打开】HANDLE OpenEvent(dwDesiredAccess,bInheritHandle,lpName);
【置位】BOOL SetEvent(hEvent);
【复位】BOOL ResetEvent(hEvent);
【发脉冲,将事件触发后立即设置为未触发】BOOL PulseEvent(hEvent);
【关闭】CloseHandle(hEvent);

五、信号量

1、信号量是内核对象。
2、当前资源数量大于0,表示信号量处于触发,等于0表示资源已经耗尽故信号量处于末触发。
3、可以解决进程间同步问题,因此也能解决互斥问题。
4、常用接口
【创建】HANDLE CreateSemaphore(lpSemaphoreAttributes,lInitialCount,lMaximumCount,lpName);
【打开】HANDLE OpenSemaphore(dwDesiredAccess,bInheritHandle,lpName);
【释放】BOOL ReleaseSemaphore(hMutex);
【关闭】CloseHandle(hEvent);

六、读写锁

1、读写锁声明后要初始化,但不用销毁,系统会自动清理读写锁。
2、读取者和写入者分别调用不同的申请函数和释放函数。
3、一个线程仅能锁定资源一次,不能多次锁定资源。
4、常用接口
【初始化】VOID InitializeSRWLock(SRWLock);
【申请写】VOID AcquireSRWLockExclusive(SRWLock);
【释放写】VOID ReleaseSRWLockExclusive(SRWLock);
【申请读】VOID AcquireSRWLockShared(SRWLock);
【释放读】VOID ReleaseSRWLockShared(SRWLock);

七、WaitForSingleObject返回值

WAIT_ABANDONED:当hHandle为mutex时,如果拥有mutex的线程在结束时没有释放核心对象会引发此返回值。
WAIT_OBJECT_0:指定的对象有信号状态。
WAIT_TIMEOUT:等待超时。
WAIT_FAILED:出现错误,可通过GetLastError得到错误代码。

八、PV操作

P:消息是否到达
V:发送消息

相当于:
等待事件
置位事件

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

多线程小记 的相关文章

  • 03 xxl-job任务执行流程

    作业类型 xxl job支持七种作业类型 Bean GLUE Java GLUE Shell GLUE Python GLUE PHP GLUE Nodejs GLUE PowerShell 其中 GLUE类型作业都是在admin管理端编辑
  • Qt信号发送过快,槽函数处理不过来解决方法

    问题 跨线程使用信号与槽连接 信号的发送时间间隔小于槽函数处理的时间间隔 造成的问题 子线程下的槽函数 用sleep来模拟槽函数的耗时操作 void MyThread myTimeout qDebug lt lt test QThread
  • Linux 多线程原理深剖

    目录 传统艺能 Linux 线程 phread 二级页表 线程优点 线程缺点 线程异常 进程与线程 多线程共享 Linux线程控制 POSIX线程库 线程的创建 获取线程id 线程等待 线程终止 线程分离 进程地址空间布局 传统艺能 小编是
  • 14.QueuedConnection和BlockingQueuedConnection连接方式源码分析

    QT信号槽直连时的时序和信号槽的连接方式已经在前面的文章中分析过了 见https blog csdn net Master Cui article details 109011425和https blog csdn net Master C
  • java中synchronized关键字

    1 synchronized关键字简介 synchronized是java中的一个关键字 在中文中为同步 也被称之为 同步锁 以此来达到多线程并发访问时候的并发安全问题 可以用来修饰代码块 非静态方法 静态方法等 修饰代码块时 给当前指定的
  • 无线传感网必知必会

    一 填空题 传感器网络三大基本要素 传感器 感知对象 用户 观测者 传感器节点的基本功能模块包括 数据采集模块 数据处理和控制模块 通信模块 供电模块 四个 其中 通信模块 能量消耗最大 传感器节点通信模块的工作模式有 发送 接收 空闲 睡
  • Java的线程同步 & 并发操作

    并发 CUP在同一时间或同一时段内只能执行一件事情 而不同时件执行时 切换得十分快速 因为CUP的频率非常高 切换的速度人根本感受不出来 同步 同步是多个任务进行时 按照一定的规律进行着 线程并发 同一时间间隔中 有多个线程在同时执行 就是
  • futureTask RunnableFuture Future 三者关系认知

    对于这三者首先我们看下源码 之后在分别写几个demo讲解下用法 public interface RunnableFuture
  • JUC编程

    1 JUC JUC就是java util concurrent工具包的简称 这是一个处理线程的工具包 JDK 1 5开始出现的 1 传统的synchronized public class Synchronized public stati
  • Disruptor 详解

    Disruptor 详解 想了解一个项目 最好的办法就是 把它的源码搞到本地自己捣鼓 在网上看了 N 多人对 Disruptor 速度的吹捧 M 多人对它的机制分析 就连 Disruptor 官方文档中 也 NB 哄哄自诩 At LMAX
  • 多线程实现事务回滚

    多线程实现事务回滚 特别说明CountDownLatch CountDownLatch的用法 CountDownLatch num 简单说明 主线程 mainThreadLatch await 和mainThreadLatch countD
  • cpu的出错概率?

    我今天想到了一个很不懂的问题 cpu执行指令会出错吗 出错的概率是多少 为什么服务器能够不间断的工作很长时间呢 难道cpu指令级的东西不会出错 操作系统怎么避免这些错误呢 2012 5 27 找到一篇文章 http wuyudong blo
  • 多线程快速处理List集合(结合线程池的使用)

    有一个大List集合 遍历进行一些耗时操作 不能达到性能要求 查询日志 单个任务虽然有不少数据库和第三方API请求 比较耗时 但返回效率尚可 所以优先采用多线程方式进行处理并行请求数据库和第三方API 因为处理完还要对list所属的数据进行
  • synchronized关键字修饰static方法和非static方法学习测试结论

    最近在学习研究synchronized关键字 发现有个疑问 在同一个类中 有多个sync方法 当线程调用其中的一个方法的时候 其他的线程能调用其他的sync方法么 为此做了简单的测试 详细的测试过程略过 读者可使用测试代码自行操作 得出结论
  • Java 多线程模式 —— Guarded Suspension 模式

    Part1Guarded Suspension 模式的介绍 我们只从字面上看 Guarded Suspension 是受保护暂停的意思 1Guarded Suspension 模式 在实际的并发编程中 Guarded Suspension
  • 02Linux下C语言锁的学习之Linux下的读写锁

    02Linux下C语言锁的学习之Linux下的读写锁 概述 下面的锁的意思均是代表读写锁 读写锁的特性 1 若一把锁被一个线程以读方式锁住 当其它线程以读方式上锁的话 那么可以上锁成功 2 若一把锁被一个线程以写方式锁住 当其它线程以读或者
  • 阿里巴巴开发手册-并发处理

    强制 获取单例对象要线程安全 在单例对象里面做操作也要保证线程安全 说明 资源驱动类 工具类 单例工厂类都需要注意 强制 线程资源必须通过线程池提供 不允许在应用中自行显式创建线程 说明 使用线程池的好处是减少在创建和销毁线程上所花的时间以
  • iOS线程初探(四) GCD 和 NSOperation 小结

    参考资料 关于iOS多线程 看我就够了 GCD 在GCD中 有两个概念很重要 那就是任务和队列 任务 其实就是你需要做的事情 一个Block而已 任务有两种执行方式 同步执行和异步执行 同步执行 会阻塞当前线程 直至该任务执行完成后当前线程
  • ScheduledThreadPoolExecutor周期定时任务异常处理踩坑的问题!!

    问题原因 在公司写项目的时候 有一个周期定时任务的需求 就想着阿里巴巴开发手册里不是说不能用Executors去创建线程池 因为存在如下问题 FixedThreadPool和SingleThreadPool 允许的请求队列长度为 Integ
  • JUC的常见类

    目录 Callable ReentrantLock Semaphore CountDownLatch JUC 即 java util concurrent 其中存放了一些进行多线程编程时有用的类 Callable Callable是一个接口

随机推荐

  • Linux新手入门必须学会的相关知识

    Linux新手入门必须学会的相关知识 Linux基本知识 1 Linux基本介绍 Linux是什么 Linux的诞生过程 Linux内核与Linux内核发行版 常见的Linux发行版 2 Linux基础安全介绍 SSH登录方式介绍 SSH基
  • 嵌入式系统开发入门(一)

    1 开发工具概览 1 1硬件 1 1 1开发平台 基础系统 树莓派raspberry 选用4B版本 单片机系统 arduino 进阶系统 JETSON nano 1 1 2 配件 摄像头 开发板专用摄像头 树莓派 JETSON nano
  • python代码~满屏小练习

    完整代码如下 import tkinter as tk import random import threading import time def boom window tk Tk width window winfo screenwi
  • debian 11搭建ftp

    配置本地用户 创建用户 adduser user1 编辑配置文件 vim etc vsftpd conf grep v listen yes local enable YES 本地用户登陆限制 write enable YES 本地用户写权
  • QT教程:基本控件及相关类的介绍和使用

    一 QString类 Qt提供了自己的字符串处理类 不用担心内存分配以及关于 0结尾的这些注意事项 QSting会自动对占用的内存进行扩充 链接非常的迅速 实例 QString str hello str world 拼接字符串操作 对象函
  • Kafka工具类

    package com cnic utils import org apache flink api common serialization SimpleStringSchema import org apache flink api c
  • Visual Studio Coda配置GLSL开发环境

    前言 最近一狠心 决定去逼自己学习着色器 最近先开个头 记录一下 也方便以后有人来参考 为了方便调试 我为我的VSCode安装了如下插件 1 Shader languages support for VS Code 这个没什么好说的 安装好
  • ConnectionResetError: [Errno 104] Connection reset by peer

    Traceback most recent call last File root autodl tmp siamFC tools train py line 13 in
  • 新手注意事项-visual studio 来实现别踩白块儿

    自己之前为了熟悉easyx练习过一个简单的项目 别踩白块儿 链接在这里 别踩白块儿 当时比较稚嫩 很多东西都不会 可以说是只知道最基本的语法 头文件都不知道 一个一个查资料弄懂的 还是比较艰难哈哈 今天想着重新打开一下那个项目 结果运行错误
  • 计算机组成原理中主机概念,计算机组成原理概念术语

    计算机组成原理概念术语 第一章 1 主机 主机中包含了除输入输出设备以外的所有电路部件 是一个能够独立工作的系统 2 CPU 中央处理器 是计算机的核心部件 同运算器和控制器构成 3 运算器 计算机中完成运算功能的部件 由ALU和寄存器构成
  • 单个数码管循环显示1-9

    一 实验要求 使用51单片机控制单个数码管 使其循环显示0 9 二 实验原理 数码管 Segment Displays 由多个发光二极管封装在一起组成 8 字型的器件 引线已在内部连接完成 只需引出它们的各个笔划 公共电极 数码管实际上是由
  • 【Grafana】CentOS下安装MySQL+Grafana添加MySQL数据源

    Grafana CentOS下安装MySQL Grafana添加MySQL数据源 本文主要介绍在CentOS环境下安装MySQL数据库 然后在Grafana中添加MySQL数据源 根据传输数据在Grafana中绘制dashboard并显示
  • vue+条形码

    前言 在vue中生成条形码的插件 vue barcode 官方文档 vue barcode是JsBarcode的一个简单包装 所以在使用时的配置属性需要在JsBarcode中查看JsBarcode官方文档 展示效果 使用步骤 步骤一 安装
  • 05-思维导图Xmind快速入门

    文章目录 5 1 认识思维导图 5 2 Xmind的主要结构及主题元素 5 2 1 Xmind的多种结构 5 2 2 主题分类 5 2 3 Xmind的主题元素 章节总结 5 1 认识思维导图 什么是思维导图 思维导图是一种将思维进行可视化
  • Blender2.92下载安装教程

    Blender2 92下载安装教程 1 下载Blender 2 安装Blender 1 下载Blender 直达链接 Blender官网链接 手动复制 https www blender org 两种方式可自选 进入官网点击这里 可根据自己
  • 【医学图像处理】用于肝血管分割的平均教师辅助置信学习

    标题 Noisy Labels are Treasure Mean Teacher Assisted Confident Learning for Hepatic Vessel Segmentation 作者 Donghuan Lu 腾讯天
  • django配置随时执行的脚本,使用运行时的manage环境执行程序

    有时候需要在启动django后执行一些数据的实时采集或更新操作 这篇博客记录脚本的配置与运行 安装依赖 首先安装依赖 pip install django extensions 然后在setting的INSTALLED APPS配置中添加d
  • OpenCV图像处理——轮廓检测

    目录 图像的轮廓 查找轮廓 绘制轮廓 轮廓的特征 轮廓面积 轮廓周长 轮廓近似 凸包 边界矩形 最小外接圆 椭圆拟合 直线拟合 图像的矩特征 矩的概念 图像中的矩特征 图像的轮廓 查找轮廓 binary contours hierarchy
  • 手机串口终端

    手机串口终端 做嵌入式开发的小伙伴永远离不开串口 想想一下 假设你需要进行现场调试 但是身边没有电脑 或者其他特殊环境不方便用电脑 或者就是单纯的懒得用电脑 该怎么办 这就是我碰到的场景 而且不止一次 说多了都是泪 别问 这种情况你就只能把
  • 多线程小记

    创建线程的几种方法 C 多线程之 beginthread https blog csdn net u013043408 article details 83830181 C 多线程之CreateThread https blog csdn