C++多线程通信

引言

多线程同步与多线程通信实质上是两种相互关联但又不完全相同的东西。本文注重多线程同步与多线程通信的区别,同时重点讲述多线程通信中的消息队列。

区别

多线程通信通常指的是线程之间交换信息或数据的方式。线程之间可能需要共享数据、发送消息或信号,以便协调它们的行为或实现某种协作。

多线程同步则是关于控制或协调多个线程的执行顺序,以确保它们能够正确地共享资源或执行特定的任务序列。同步机制用于防止数据竞争(data race)和其他并发问题,例如死锁(deadlock)和活锁(livelock)。

活锁

关于活锁记录一下。

什么是活锁

活锁(Livelock)是一种特殊的并发现象,它发生在多个进程或线程在尝试访问共享资源时,由于某种条件没有满足,导致它们不断重复尝试访问,但始终无法成功。这些进程或线程在活锁状态下会不断地改变状态,但它们并没有真正地“前进”,因此得名“活锁”。

活锁可以认为是一种特殊的饥饿现象,因为进程或线程虽然没有被阻塞,但它们始终无法访问所需的资源,从而导致它们无法继续执行。

与死锁的区别

与死锁(Deadlock)不同的是,活锁中的实体(进程或线程)并没有停止运行,而是不断尝试访问资源,但由于某些条件没有满足(例如,资源被其他进程占用,或者进程间的通信出现问题),它们始终无法成功访问。因此,活锁有可能自行解开,只要满足了相关条件,进程或线程就可以成功访问资源。

如何避免活锁

一种简单方法是采用先来先服务的策略,当多个事务请求封锁同一数据对象时,封锁子系统按请求封锁的先后次序对事务排队,数据对象上的锁一旦释放就批准申请队列中第一个事务获得锁。这样可以确保每个进程或线程都有机会访问资源,从而避免活锁的发生。

多线程通信

多线程通信的方式有:
共享内存、消息队列、互斥锁、条件变量、信号量、future和promise。
互斥锁、条件变量、信号量、future和promise的使用可以查阅:
多线程同步(上)
多线程同步(下)
本文主要讲解消息队列。

示例

下面是一个简单的实现示例。实现的是两个线程同时对一个消息队列操作,消息队列最大容纳5个数据,一个生产者线程向里存数据,一个消费者线程向外取数据,总共循环十次。

#include <iostream>  
#include <thread>  
#include <queue>  
#include <mutex>  
#include <condition_variable>  

using namespace std;
constexpr int Max = 5;
constexpr int g_count 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

肩上风骋

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值