Linux多线程通信

linux 多线程的线程控制和线程通信 1.Linux“线程”      进程与线程之间是有区别的,不过Linux内核只提供了轻量进程的支持,未实现线程模型。Linux是一种“多进程单线程”的操作系统。Linux本身只有进程的概念,而其所谓的“线程”本质上在内核里仍然是进程。      大家知道,进程是资源分配的单位,同一进程中的多个线程共享该进程的资源(如作为共享内存的全局变量)。Linux中所谓的“线程”只是在被创建时clone 阅读详情

多线程编程作为程序员必须掌握的一项技能,看到一篇好的博客,适合初学者入门。以一个简单的、著名的生产者/消费者问题实例,比较清晰地阐述了linux线程的控制和通信。一组生产者线程与一组消费者线程通过缓冲区发生联系。生产者线程将生产的产品送入缓冲区,消费者线程则从中取出产品。缓冲区有N个,是一个环形的缓冲池。原文链接如下(链接),代码如下,看懂这部分代码就算入门Linux多线程了。


#include <stdio.h>
#include <pthread.h>
#define BUFFER_SIZE 16//缓冲区数量

struct prodcons
{
	//缓冲区相关数据结构
	int buffer[BUFFER_SIZE];//实际数据存放的数组
	pthread_mutex_t lock;//互斥体lock用于对缓冲区的互斥操作
	int readpos,writepos;//读写指针
	pthread_cond_t notempty;//缓冲区非空的条件变量
	pthread_cond_t notfull;//缓冲区未满的条件变量
};
//初始化缓冲区结构
void init(struct prodcons *b)
{
	pthread_mutex_init(&b->lock,NULL);
	pthread_cond_init(&b->notempty,NULL);
	pthread_cond_init(&b->notfull,NULL);
	b->readpos = 0;
	b->writepos = 0;
}
//生产者将产品放入缓冲区,这里是存入一个整数
void put(struct prodcons *b,int data)
{
	pthread_mutex_lock(&b->lock);
	//等待缓冲区未满
	if((b->writepos+1)%BUFFER_SIZE == b->readpos)
	{
		pthread_cond_wait(&b->notfull,&b->lock);//用来等待条件变量被设置
	}
	//写数据,并移动指针
	b->buffer[b->writepos]=data;
	b->writepos++;
	if(b->writepos >= BUFFER_SIZE)
	{
		b->writepos = 0;
	}
	//设置缓冲区非空的条件变量
	pthread_cond_signal(&b->notempty);//解除某一个等待线程的阻塞状态
	pthread_mutex_unlock(&b->lock);//给互斥变量解锁
}

//消费者从缓冲区取出整数
int get(struct prodcons *b)
{
	int data;
	pthread_mutex_lock(&b->lock);
	//等待缓冲区非空
	if(b->writepos == b->readpos)
	{
		pthread_cond_wait(&b->notempty,&b->lock);
	}

	//读数据,移动读指针
	data = b->buffer[b->readpos];
	b->readpos++;
	if(b->readpos >= BUFFER_SIZE)
	{
		b->readpos = 0;
	}
	//设置缓冲区未满的条件变量
	pthread_cond_signal(&b->notfull);
	pthread_mutex_unlock(&b->lock);
	return data;
}

/*测试:生产者线程将1到10000的整数送入缓冲区,消费者线程从缓冲区中获取整数,两者都打印信息*/
#define OVER (-1)
struct prodcons buffer;
void *producer(void *data)
{
	int n;
	for(n=0;n<20;n++)
	{
		printf("%d---->\n",n);
		put(&buffer,n);
	}
	put(&buffer,OVER);
	return NULL;
}

void *consumer(void *data)
{
	int d;
	while(1)
	{
		d = get(&buffer);
		if(d == OVER)
		{
			break;
		}
		printf("--->%d\n",d);
	}
	return NULL;
}

int main(void)
{
	pthread_t th_a,th_b;
	void *retval;
	init(&buffer);
	//创建生产者和消费者线程
	pthread_create(&th_a,NULL,producer,0);
	pthread_create(&th_b,NULL,consumer,0);
	//等待两个线程结束
	pthread_join(th_a,&retval);
	pthread_join(th_b,&retval);
	return 0;
}


linux 下基于特定通信协议利用多线程同步通信机制实现的串口通信 /** *@Title:利用多线程同步通信机制实现串口通信 *@Introduce:主要完成根据特定的通信协议实现串口与PC上特定串口 * 通信软件的通信。测试版,只是完成主要框架,没有完全将协议的 * 所有通信方式方法做完。 * 其中包含的测试功能有:监听主机(PC上的软件)发送的特定请求, * 能够识别类型,并解析包含里面的信息,并且自动回复,所写的根 * 据协议要求的固定消息结 阅读详情

相关推荐

Linux下TCP多进程/多线程套接字通信

上篇文章简单的介绍了一下Linux下套接字通信的相关知识:  http://blog.youkuaiyun.com/qq_29503203/article/details/60961537 但是存在一个缺陷就是只能进行单进程通信,我们都知道实际上不可能一个服务器一次只能有一个客户端,所以在这里对其进行一个改进,我们通过fork出子进程去完成客户端发来的请求,而父进程只需用去accpet连接请求

qq_29503203的博客 4469

linux基础——linux线程间通信及同步机制总结

线程间的通信有两种情况: 1、一个进程中的线程与另外一个进程中的线程通信,由于两个线程只能访问自己所属进程的地址空间和资源,故等同于进程间的通信。 2、同一个进程中的两个线程进行通信。本文说的就是第二种情况。 关于进程间通信(IPC)可以看我的另一篇博文 http://blog.youkuaiyun.com/a987073381/article/details/52006729

千里之行,始于足下 4万+

Linux下基于socket多线程并发通信的实现

pthread_server.c /*************************************************** * 文件名:pthread_server.c * 文件描述:创建子线程来接收客户端的数据 ***************************************************/ #include #include

张勤一 1万+

linux下多线程通信(一)

在linux下进行多线程编程,肯定会涉及到线程通信问题,本文主要分析pipe,即管道在多线之间通信实现。 #include&amp;amp;amp;amp;lt;unistd.h&amp;amp;amp;amp;gt; int pipe(int filedes[2]); 返回值:成功,返回0,否则返回-1。 参数数组包含pipe使用的两个文件的描述符。fd[0]:读管道,fd[1]:写管道 两个线程之间通信简单实现,单向pipe_1.c 在这里插入代码片 ...

jeremy的博客 1万+

linux C实现socket通信(单线程和多线程的实现)

socket通信是网络编程的基础,对于其概念的解释以及知识点的介绍网上都写的很详细了,这里不再啰嗦,这里主要是基于linux实现简单的客户端服务器端通信,功能为从客户端输入一行字符(可包含空格),服务器收到后进行显示并将收到的字符串再发送给客户端,并且服务器端可以一直对客户端的连接进行监听(这里先只实现一个客户端的连接,后面引入多线程,让多个客户端可以同时连接服务器端)。 服务器端流程为创建socket->绑定->监听->连接->通信->关闭socket 代码里有详细注释,

lj779323436的博客 3796

BMS | 从一串到几百串硬件架构简介

锂电池在生活中越来越多的方面扮演能源的角色,除了大家熟知的电动汽车行业,在一些消费类,工业类电子产品比如手机,电动自行车,电动工具中都有应用,追本溯源今天我们一起来学习下最基础的BMS架构。 1~4串架构 以S8241为代表的无通信/无固件/模拟器件 可实现过充保护、过放保护、过流/短路,参数由器件后缀代码决定;通信类手持设备供电系统;1~4节电池保护板架构 如图使用S-8241系列保护IC,一对充放电MOS管控制充放电的回路的切断和接通,系统供电来自于电芯电压,VM引脚用于检测过...

ningvay的博客 9916

Linux下的线程

多线程编程实例         Linux系统下的多线程遵循POSIX标准,叫作pthread,可以使用man pthread在Linux系统下查看系统对线程的解释。编写Linux下的线程需要包含头文件pthread.h,在生成可执行文件的时候需要链接库libpthread.a或者libpthread.so。         下面给出一个简单的多线程

知足且坚定,温柔且上进 454

用友u8服务器优化,用友U8erp软件运行的性能优化方案图文教程

今天一定要给大家分享一下用友U8erp软件运行的性能优化方案图文教程,以下方案来自用友软件官方维护工程师反馈在在处理客户问题的时候,有一类问题较为挠头,就是诸如用友U8服务器效率低下的问题。比如用友U8运行慢,卡住等,我们暂先不提用友U8软件代码、脚本层面本身的性能提升问题,我们只是基于现有用友U8软件版本,在客户现有环境下排查用友U8软件运行的性能瓶颈,并采取一定的技术手段进行性能调校。本文将推...

weixin_39882870的博客 5306

Linux的进程/线程间通信

Linux系统中的进程间通信方式主要以下几种: 同一主机上的进程通信方式    * UNIX进程间通信方式: 包括管道(PIPE), 有名管道(FIFO), 和信号(Signal)    * System V进程通信方式:包括信号量(Semaphore), 消息队列(Message Queue), 和共享内存(Shared Memory) 网络主机间的进程通信方式  

庚午步雲 841

高速DAC时钟与配置实战:DAC5681Z硬件设计与寄存器编程详解

在高速数据转换系统中,时钟信号是决定系统性能的核心要素,其稳定性和纯净度直接影响数模转换器(DAC)的输出频谱纯度与动态范围。时钟电路的设计原理涉及信号完整性、阻抗匹配与直流偏置,而内部锁相环(PLL)和延迟锁相环(DLL)的配置则是实现精确时序控制的关键技术。这些技术的价值在于,它们共同保障了高速通信、雷达和任意波形生成等应用对信号实时性与精度的严苛要求。本文聚焦于德州仪器(TI)的DAC5681Z,深入解析其外部时钟输入电路的硬件设计要点,包括端接电阻的计算与选型,并详细拆解通过串行外设接口(SPI)对

weixin_30342363的博客 186

大数据架构中的数据血缘追踪技术解析

数据血缘(Data Lineage)是指数据从源头到目标的完整流转路径,它记录了数据在整个生命周期中的变化过程。在大数据架构中,数据血缘追踪技术已经成为数据治理的核心组成部分。本文旨在全面解析数据血缘追踪的技术原理、实现方法和应用实践,帮助读者深入理解这一关键技术。本文将从基础概念入手,逐步深入到技术实现细节,最后探讨实际应用和未来趋势。数据血缘的核心概念和技术原理数据血缘的数学模型和算法实现实际项目案例和代码解析主流工具和解决方案比较未来发展方向和技术挑战。

架构师的AI之路,分享AI应用开发架构的学习与实践。 687

Linux中线程间通信与同步

Linux中线程间通信与同步

qq_47417910的博客 390

超声相控阵合成孔径成像FPGA设计介绍

1.仿真预览 2.理论分析 系统的基本结构如下所示: 以上是实际中完整的结构,系统中会涉及到两块板子中的时钟,这个就是设计一个时钟采样同步的问题,即所谓的时钟同步。一般这种情况,往往使用内插的方式来解决。这是由于,在实际中,超生波接收到的信号是由本身系统发送出去反射回来得到的,因此从另外一方面将,其是同步的。但是在接收的时候通过内插的方法解决其中的延迟问题。 根据论文中的介绍,整个系统分为如下几个部分: ·模拟发送信号,这个部分由MATLAB产生测试数据并量...

FPGA/MATLAB学习教程/源码/项目合作开发 2069

Linux 多线程通信

 摘自资料(linux 与Windows不同)     线程间无需特别的手段进行通信,因为线程间可以共享数据结构,也就是一个全局变量可以被两个线程同时使用。不过要注意的是线程间需要做好同步,一般用mutex。可以参考一些比较新的UNIX/Linux编程的书,都会提到Posix线程编程,比如《UNIX环境高级编程(第二版)》、《UNIX系统编程》等等。 linux的消息属于IPC,也就是进程间通

lanmoshui963的专栏 5万+

SwinTransformer 改进:SSPCAB模块(2024最新改进方法)

SSPCAB(Spatial Pyramid Pooling with Channel Attention Block)是2024年提出的一种新型神经网络架构改进方法,专注于在保持高精度的同时显著降低计算复杂度和参数量。该方法通过创新的空间金字塔池化与通道注意力机制的结合,实现了网络结构的紧凑化和运算效率的大幅提升。核心创新点1. 混合空间金字塔池化(Hybrid Spatial Pyramid Pooling, HSPP)多尺度动态核池化:根据输入特征图尺寸动态调整池化核大小和步长交叉级联结构。

Henry的博客 1305

Vue - 简约大气 404 页面

效果图 实现代码 复制即可。 <template> <div> <div class="error"> <!-- 图片可保存到本地 --> <img src="https://img-blog.csdnimg.cn/20210715111039922.png"> <p>抱歉!你访问的页面不存在或已删除 :( </p> <span class="back" @click="go(

🏆 前端领域优质创作者 3369

Linux/Unix 多线程通信

Linux/Unix 多线程通信 线程间无需特别的手段进行通信,因为线程间可以共享数据结构,也就是一个全局变量可以被两个线程同时使用。 不过要注意的是线程间需要做好同步,一般用 mutex。 可以参考一些比较新的 UNIX/Linux 编程的书,都会提到 Posix 线程编程,比如《UNIX环境高级编程(第二版)》、《UNIX系统编程》等等。 Linux 的消息属于 IPC,也就是进程间通信,线...

r_m_AA的博客 330

DISM进行系统修复,进度条卡在63.2%的解决方法

一时用不了软件,安装修复的时候也出现问题 DISM一直卡在63.2%,等了好久时间,直接强制退出寻找最终的解决方案

码农研究僧的博客 1万+

linux多线程socket通信程序,Linux下基于soCket多线程并发通信实现.pdf

网络与通信 《微计算机信息》( 管控一体化)2009 年第25 卷第 5-3 期文章编号:1008-0570(2009)05-3-0070-03Linux 下基于socket 多线程并发通信的实现The accomplishment of multi-pthread Communication Ba...

weixin_32325225的博客 256

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

Linux驱动多线程通信方式

Linux是多任务操作系统,肯定会存在多个任务共同操作同一段内存或者设备的情况,多个任务甚至中断都能访问的资源叫做共享资源。在驱动开发中要注意对共享资源的保护,也就是要处理对共享资源的并发访问。C语言中 a = 3 这样一句代码,它编译时候其实不是一句代码,而是编译成汇编的3句代码:1 ldr r0, =0X30000000 /* 变量 a 地址 */2 ldr r1, = 3 /* 要写入的值 */

weixin_44651073的博客 941

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

Linux多线程网络通信

Linux下多线程TCP通信

m0_49586319的博客 425

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

linux下的多线程通信

在Linux下,多线程通信主要涉及共享内存和线程间同步。因为Linux的线程库(POSIX线程库,或称为pthreads)允许线程共享进程的地址空间,所以线程间可以直接读写共享的内存区域来实现通信。然而,由于多个线程可能同时访问和修改共享数据,因此需要使用同步机制来避免数据竞争和不一致。

qq_42241500的博客 1032

Linux多线程编程与线程间通信机制

Linux中多线程编程技术被广泛使用,这主要是因为多线程可以提升程序的运行效率和便利性。在现在的比较大一点的linux程序中,没有使用多线程编程技术是不可想象的。有多线程,那么就涉及到线程间的通信问题,简单来说就是线程A怎么把消息传递给线程B。目前线程间通信的用的比较多的主要技术有消息队列、共享内存。本文就来讲讲linux中多线程编程的实现,以及利用消息队列进行线程间通信。   一、线程的创建

cjyusha的专栏 9021
上一篇: 减少caffe依赖库的手写数字识别测试
下一篇: 堆栈与动态分配内存空间
csdnning
博客等级 码龄13年 1粉丝 5原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值