Linux/Windows下线程间通信机制及其API总结

线程间通信(Thread Inter-Communication, TIC)是指在一个进程内的多个线程之间进行数据交换和同步的方法。与进程间通信相比,线程间通信通常更简单、更高效,因为它们共享相同的内存空间。下面是一些常见的线程间通信机制及其相关API:

803906bd6a1345b09f93269ca7d962c4.jpeg

1. 临界区(Critical Sections)

  • 说明:临界区是一种轻量级的互斥机制,用于保护共享资源免受多个线程的同时访问。
  • 作用:确保每次只有一个线程可以访问共享资源。
  • 适用场景:当需要保护共享变量或数据结构时。
  • API
    • POSIX
      • pthread_mutex_t: 互斥锁类型。
      • pthread_mutex_init(pthread_mutex_t *mutex, const pthread_mutexattr_t *mutexattr): 初始化互斥锁。
      • pthread_mutex_lock(pthread_mutex_t *mutex): 锁定互斥锁。
      • pthread_mutex_unlock(pthread_mutex_t *mutex): 解锁互斥锁。
      • pthread_mutex_destroy(pthread_mutex_t *mutex): 销毁互斥锁。
    • Windows
      • CRITICAL_SECTION: 临界区类型。
      • InitializeCriticalSection(CRITICAL_SECTION *lpCriticalSection): 初始化临界区。
      • EnterCriticalSection(CRITICAL_SECTION *lpCriticalSection): 进入临界区。
      • LeaveCriticalSection(CRITICAL_SECTION *lpCriticalSection): 离开临界区。
      • DeleteCriticalSection(CRITICAL_SECTION *lpCriticalSection): 删除临界区。

2. 互斥锁(Mutexes)

  • 说明:互斥锁是一种更通用的同步机制,可以保护共享资源免受多个线程的同时访问。
  • 作用:确保每次只有一个线程可以访问共享资源。
  • 适用场景:当需要保护共享变量或数据结构时。
  • API
    • POSIX
      • pthread_mutex_t: 互斥锁类型。
      • pthread_mutex_init(pthread_mutex_t *mutex, const pthread_mutexattr_t *mutexattr): 初始化互斥锁。
      • pthread_mutex_lock(pthread_mutex_t *mutex): 锁定互斥锁。
      • pthread_mutex_unlock(pthread_mutex_t *mutex): 解锁互斥锁。
      • pthread_mutex_destroy(pthread_mutex_t *mutex): 销毁互斥锁。
    • Windows
      • CreateMutex: 创建互斥对象。
      • WaitForSingleObject: 等待互斥对象。
      • ReleaseMutex: 释放互斥对象。
      • CloseHandle: 关闭互斥对象。

3. 条件变量(Condition Variables)

  • 说明:条件变量与互斥锁一起使用,用于协调多个线程的执行。
  • 作用:使得线程可以等待某个条件变为真。
  • 适用场景:当线程需要等待某些条件满足时。
  • API
    • POSIX
      • pthread_cond_t: 条件变量类型。
      • pthread_cond_init(pthread_cond_t *cond, const pthread_condattr_t *cond_attr): 初始化条件变量。
      • pthread_cond_wait(pthread_cond_t *cond, pthread_mutex_t *mutex): 等待条件变量。
      • pthread_cond_signal(pthread_cond_t *cond): 唤醒一个等待的线程。
      • pthread_cond_broadcast(pthread_cond_t *cond): 唤醒所有等待的线程。
      • pthread_cond_destroy(pthread_cond_t *cond): 销毁条件变量。
    • Windows
      • CreateEvent: 创建事件对象。
      • SetEvent: 设置事件对象。
      • ResetEvent: 重置事件对象。
      • WaitForSingleObject: 等待事件对象。
      • CloseHandle: 关闭事件对象。

4. 自旋锁(Spinlocks)

  • 说明:自旋锁是一种轻量级的锁机制,主要用于短时间内保护共享资源。
  • 作用:在线程尝试获取锁时,如果锁已被占用,则线程会忙等待直到锁可用。
  • 适用场景:当锁的持有时间很短,频繁地获取和释放锁时。
  • API
    • POSIX
      • pthread_spinlock_t: 自旋锁类型。
      • pthread_spin_init(pthread_spinlock_t *lock, int pshared): 初始化自旋锁。
      • pthread_spin_lock(pthread_spinlock_t *lock): 锁定自旋锁。
      • pthread_spin_unlock(pthread_spinlock_t *lock): 解锁自旋锁。
      • pthread_spin_destroy(pthread_spinlock_t *lock): 销毁自旋锁。

5. 原子操作(Atomic Operations)

  • 说明:原子操作是在一个指令周期内完成的操作,不可分割。
  • 作用:在无需显式锁的情况下实现线程安全的数据访问。
  • 适用场景:当需要在无需锁的情况下更新共享变量时。
  • API
    • POSIX
      • __sync_add_and_fetch: 原子加并取值。
      • __sync_fetch_and_add: 原子取并加。
      • __sync_val_compare_and_swap: 原子比较并交换。
    • Windows
      • _InterlockedIncrement: 原子增加。
      • _InterlockedDecrement: 原子减少。
      • _InterlockedCompareExchange: 原子比较并交换。

6. 信号量(Semaphores)

  • 说明:信号量是一种用于控制多个线程对共享资源访问的同步机制。
  • 作用:用于控制线程对共享资源的访问。
  • 适用场景:当需要限制同时访问共享资源的线程数量时。
  • API
    • POSIX
      • sem_t: 信号量类型。
      • sem_init(sem_t *sem, int pshared, unsigned int value): 初始化信号量。
      • sem_wait(sem_t *sem): 等待信号量。
      • sem_post(sem_t *sem): 释放信号量。
      • sem_destroy(sem_t *sem): 销毁信号量。
    • Windows
      • CreateSemaphore: 创建信号量对象。
      • WaitForSingleObject: 等待信号量对象。
      • ReleaseSemaphore: 释放信号量对象。
      • CloseHandle: 关闭信号量对象。

7. 事件(Events)

  • 说明:事件是一种用于通知线程状态改变的机制。
  • 作用:用于同步线程间的执行。
  • 适用场景:当需要通知线程状态改变时。
  • API
    • POSIX
      • pthread_cond_t: 条件变量类型,可用于实现事件。
    • Windows
      • CreateEvent: 创建事件对象。
      • SetEvent: 设置事件对象。
      • ResetEvent: 重置事件对象。
      • WaitForSingleObject: 等待事件对象。
      • CloseHandle: 关闭事件对象。

8. 屏障(Barriers)

  • 说明:屏障是一种同步原语,用于确保一组线程在继续之前都到达了一个指定点。
  • 作用:确保所有线程都达到一个同步点后再继续执行。
  • 适用场景:当需要同步一组线程时。
  • API
    • POSIX
      • pthread_barrier_t: 屏障类型。
      • pthread_barrier_init(pthread_barrier_t *barrier, const pthread_barrierattr_t *barrierattr, unsigned int count): 初始化屏障。
      • pthread_barrier_wait(pthread_barrier_t *barrier): 等待屏障。
      • pthread_barrier_destroy(pthread_barrier_t *barrier): 销毁屏障。

9. 线程局部存储(TLS, Thread Local Storage)

  • 说明:线程局部存储用于在线程之间隔离数据。
  • 作用:为每个线程提供独立的存储空间。
  • 适用场景:当需要为每个线程提供独立的数据时。
  • API
    • POSIX
      • pthread_key_t: 线程局部键类型。
      • pthread_key_create(pthread_key_t *key, void (*destructor)(void *)): 创建线程局部键。
      • pthread_setspecific(pthread_key_t key, const void *value): 设置线程局部变量的值。
      • pthread_getspecific(pthread_key_t key): 获取线程局部变量的值。
      • pthread_key_delete(pthread_key_t key): 删除线程局部键。
    • Windows
      • TlsAlloc: 分配线程局部索引。
      • TlsSetValue: 设置线程局部值。
      • TlsGetValue: 获取线程局部值。
      • TlsFree: 释放线程局部索引。

10. 读写锁(Read-Write Locks)

  • 说明:读写锁允许多个线程同时读取共享资源,但写操作时独占。
  • 作用:允许多个读操作同时进行,但写操作时独占。
  • 适用场景:当共享资源的读操作远多于写操作时。
  • API
    • POSIX
      • pthread_rwlock_t: 读写锁类型。
      • pthread_rwlock_init(pthread_rwlock_t *rwlock, const pthread_rwlockattr_t *attr): 初始化读写锁。
      • pthread_rwlock_rdlock(pthread_rwlock_t *rwlock): 读锁。
      • pthread_rwlock_wrlock(pthread_rwlock_t *rwlock): 写锁。
      • pthread_rwlock_unlock(pthread_rwlock_t *rwlock): 解锁。
      • pthread_rwlock_destroy(pthread_rwlock_t *rwlock): 销毁读写锁。

以上机制均提供了线程同步和数据保护的基本手段,选择合适的机制取决于具体的应用场景和性能需求。在实际编程中,通常需要根据具体情况选择最合适的同步机制来优化程序的性能和可维护性。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/871315.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

vue-element-admin解决三级目录的KeepAlive缓存问题(详情版)

vue-element-admin解决三级目录的KeepAlive缓存问题(详情版) 本文章将从问题出现的角度看看KeepAlive的缓存问题,然后提出两种解决方法。本文章比较详细,如果只是看怎么解决,代码怎么改,请前往配置版。 一…

【原创教程】电气电工07:网线的制作方法

电气电工经常会遇到做网线,我们做网线需要网线钳与测试仪。需要了解网线的两种接线标准。 我们来看一下网线钳的操作步骤: 这种压线钳也同时具有剥线、剪线功能。 用这种网线钳能制作RJ45网络线接头。RJ11电话线接头、4P电话线接头。适用于RJ45,RJ11型网线 做网线的时候我…

Temu全托管和半托管的区别:一文说清temu全托和半托的差异

TEMU在今年3月再出王炸,上线半托管模式。这是TEMU继全托管模式爆火跨境圈之后的又一个大动作。那么,TEMU全托管和TEMU半托管有哪些不同?卖家朋友应该如何选择呢?今天给大家详细拆解一下。 TEMU全托管和半托管有什么区别 首先是定…

汇编语言lea指令取数组偏移地址

最近看到一条指令,x86汇编, LEA BX, 6[DI] 根据资料,它的含义是,某数组含20个元素,每个元素占一个字节,序号为0~19。设DI指向数组开头处,把序号为6的元素的偏移地址送到BX中; lea指令…

如何进行长截图的两种方法

前言 本文主要讲2种截图方式,分别是谷歌和QQ。 谷歌分为Web端 和 移动端,选一种即可。 第一种:谷歌浏览器控制台自带的 1.先把控制台语言更改为中文,方便查看 ①.按F12,点击设置面板 ②.修改语言为中文并关闭 ③.点击…

BFS解决单源最短路问题

目录 迷宫中离入口最近的出口 最小基因变化 单词接龙 为高尔夫比赛砍树 迷宫中离入口最近的出口 题目 思路 使用宽度优先遍历解决这道题,需要一个二维数组标记是否被遍历过,也需要一个队列辅助完成宽度优先遍历,类似于水波纹一样&#x…

java接口 controller层接收list集合传参,postman 调用接口时required parameter XXX is not present

开发过程中开发一个java接口 controller层接收list集合传参,然后postman调用一直不成功,报错 使用RequestParam方式,如果postman 调用接口时报错required parameter XXX is not present 可能是(value“items”)跟你输…

线索获取:多渠道获客策略解析

在当今商业环境中,企业面临着激烈的市场竞争和不断变化的客户需求。在此背景下,销售线索作为销售活动的基础和起点,重要性更加凸显,尤其是在营销精耕的当下,做好线索的精细化管理成为企业获取竞争优势的关键环节之一。…

数据结构----队列

1 什么是队列? 只允许在两端进行插入和删除操作的线性表,在队尾插入,在队头删除 插入的一端,被称为"队尾",删除的一端被称为"队头" 在队列操作过程中,为了提高效率&#xff0…

《重生到现代之从零开始的C语言生活》—— 指针3

数组名的理解 在我们使用&arr[0]的方式拿到了数组第一个元素的地址,但是其实,数组名本来就地址,而且是数组首元素的地址 所以数组名就是数组首元素的地址 但是会有两个例外 sizeof(数组名),sizeof中单独放数组名&#xff0c…

[Linux] 查看系统资源 (持续更新中)

概述 在Linux中,有许多命令和工具可用于查看系统的资源使用情况。以下是一些常用的方式: top:top命令是最常见的实时系统监视工具之一。它显示了当前运行的进程列表,以及每个进程的CPU、内存使用情况、nice值等信息。top命令还会…

帆软报表,达梦数据库驱动上传失败

1、按照正常操作新建数据库连接,上传准备好的达梦驱动时,提示如图一需要修改SystemConfig.driverUpload为true才可以。 2、FineDB存储了数据决策系统中除平台属性配置以外的所有信息。详情请参见: FineDB 数据库简介。 3、因此管理员可通过…

Kubectl基础命令使用

一.Kubectl 基础命令 格式: kubectl [command] [TYPE] [NAME] [FLAGS] kubectl 是 Kubernetes 的命令行工具,用于管理 Kubernetes 集群。以下是一些常用的 kubectl 命令及其选项: 常用命令 获取资源 列出所有资源类型(Pods、De…

机器学习|什么是梯度下降(小白向)|探寻最优解之路

文章目录 前言一、什么是梯度下降?二、梯度下降法一般步骤1.确定一个小目标——预测函数2.找到差距——代价函数3.明确搜索方向——梯度计算4.一步要走多远?——学习率 三、梯度下降的分类批量梯度下降(Batch Gradient Descent)随…

2007-2022年上市公司资源节约数据

2007-2022年上市公司资源节约数据 1、时间:2007-2022年 2、来源:上市公司年报、社会责任报告、上市公司网站信息 3、指标:水资源节约、电力节约、原煤节约、天然气节约、汽油节约、柴油节约、集中供热节约、折算成统一标准煤共计节约 4、…

flume--数据从kafka到hdfs发生错误

解决: #1.将flume自带的依赖删除 mv /opt/installs/flume1.9/lib/guava-11.0.2.jar /opt/installs/flume1.9/lib/guava-11.0.2.jar.bak #2.将hadoop的依赖发送到flume下 cp /opt/installs/hadoop3.1.4/share/hadoop/common/lib/guava-27.0-jre.jar /opt/installs/f…

有哪些同声传译软件?精选5款实用工具

在浪漫之都巴黎,每一步都踏着历史与艺术的韵律。从埃菲尔铁塔下仰望的震撼,到塞纳河畔悠闲的咖啡时光,打卡巴黎地标已不再满足于传统方式。 如今,#打卡巴黎地标的方式nextlevel了#,科技与文化的碰撞开启了全新的体验篇…

『基础』线性代数-1行列式

行列式是什么-运算规则 排列:不同的 n 元排列共有 n! 个 逆序:小数排在大数后面,叫逆序;一个排列中逆序的总和叫做这个排列的逆序数,记为 τ ( j 1 , . . . , j n ) \tau(j_1,...,j_n) τ(j1​,...,jn​) 逆序数的计…

IP SSL证书的未来趋势:适应不断变化的安全挑战

随着网络攻击手段的不断进化和用户对隐私保护意识的增强,IP SSL证书作为保障网络安全的关键组件之一,也在不断地发展和完善。本文将探讨IP SSL证书的未来趋势,以及如何适应这些不断变化的安全挑战。 当前状况与挑战 网络安全意识提升&#…

LORA通信详解

LORA(Long Range Radio)是一种低功耗广域网(LPWAN)技术,专门设计用于物联网(IoT)设备的远距离通信。其长距离传输和低功耗特性使其在智能城市、环境监测、农业等领域中得到了广泛应用。 一、LOR…