【6】DongshanPI-Seven 应用开发_多线程编程记录

news2024/12/23 10:12:56

目录

  • 1、多线程编程
    • 1.1 测试程序
  • 1.2 测试结果

1、多线程编程

  在Linux系统中,调度是以线程为单位的,资源分配是以进程为单位的。多进程是指多个main()函数的程序,多线程,只有1个main()函数。进程和线程是多任务操作系统中的两种不同的执行单元。它们之间的区别主要有以下几点:

  • 资源占用:进程是资源分配的基本单位,每个进程都有自己的地址空间、文件描述符和其他系统资源。而线程则是进程内的执行单元,在同一进程内的所有线程共享同样的资源,比如同一地址空间和文件描述符。

  • 独立性:进程是独立执行的程序,进程间通信需要通过 IPC(进程间通信)机制进行。而同一进程内的线程,彼此之间可以通过共享的地址空间和全局变量进行通信。

  • 调度和切换:进程是操作系统资源调度和分配的基本单位,进程切换的开销比线程要大。线程的切换则比进程轻量级的多,开销较小。

  • 安全性:由于进程拥有独立的地址空间,因此各个进程之间的数据互不影响,保证了程序的安全性。然而,由于线程共享同一地址空间,因此实现线程间的同步和互斥会有更高的挑战性,需要使用锁等机制进行保证。

1.1 测试程序

#include <pthread.h>
#include <stdio.h>
#include <unistd.h>
#include <semaphore.h>
#include <string.h>

/*
 * int pthread_create(pthread_t *thread, const pthread_attr_t *attr,
							  void *(*start_routine) (void *), void *arg);
 *  thread: 指向线程标识符的指针,该标识符在创建线程时自动分配
 *	attr:	线程属性对象,包含线程的其他属性,如堆栈大小等。如果传入 NULL,则使用默认的线程属性。
 *  start_routine:线程要运行的函数的指针,该函数的参数和返回值为void*类型指针。
 * 	arg:传递给线程函数的参数
 *	retval: 成功返回0;失败返回错误码
 */

static char g_recvbuf[100];
static sem_t g_sem; // 信号量
static pthread_mutex_t g_tMutex = PTHREAD_MUTEX_INITIALIZER; // 互斥量
static pthread_cond_t g_tConVar = PTHREAD_COND_INITIALIZER;	 // 条件变量

// 线程函数
void *my_thread_func(void *data)
{
	while(1)
	{
		//sem_wait(&g_sem);
		// 等待条件成立, 若条件不成立则释放互斥量继续等待
		pthread_mutex_lock(&g_tMutex);
		pthread_cond_wait(&g_tConVar, &g_tMutex);  

		printf("recv: %s\n",g_recvbuf);
		pthread_mutex_unlock(&g_tMutex);
	}

	return NULL;
}

/*
 * 创建接收线程
 * 主线程读取标准输入,发给接收线程
 */
int main(int argc, char **argv)
{
	pthread_t tid;
	int iRet;
	char buf[100];

	sem_init(&g_sem, 0, 0);
	
	iRet = pthread_create(&tid, NULL, my_thread_func, NULL);
	if(iRet)
	{
		printf("pthread_create err!\n");
		return -1;
	}

	while(1)
	{
		fgets(buf, 100, stdin);
		pthread_mutex_lock(&g_tMutex);
		memcpy(g_recvbuf, buf, 100);
		pthread_cond_signal(&g_tConVar); // 通知条件成立
		pthread_mutex_unlock(&g_tMutex);
	
		//sem_post(&g_sem); 
	}
	return 0;
}

1.2 测试结果

主要用到的编译命令

1.编译时链接pthread库
	gcc -o pthread pthread.c -lpthread

2.查看运行的线程
	ps -T
	
3.后台执行程序,程序执行后命令行还可以输入命令
	./pthread &  

4.kill线程
	kill -9  线程号

5.查看cpu使用率占比高的程序
	top 查看线程对cpu使用率

测试结果
在这里插入图片描述


To Be Continue …

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Linux 基于 UDP 协议的简单服务器-客户端应用

目录 一、socket编程接口 1、socket 常见API socket()&#xff1a;创建套接字 bind()&#xff1a;将用户设置的ip和port在内核中和我们的当前进程关联 listen() accept() 2、sockaddr结构 3、inet系列函数 二、UDP网络程序—发送消息 1、服务器udp_server.hpp initS…

【Flutter】自动生成图片资源索引插件一:FlutterAssetRefGenerator

介绍 FlutterAssetRefGenerator 插件&#xff1a;windows上 点击生成图片索引按钮后&#xff0c;pubspec.yaml 会出现中文乱码&#xff0c;需要手动改乱码&#xff1b;mac上没问题。 优点&#xff1a;点击图标自动生成。 目录 介绍一、安装二、使用 一、安装 安装FlutterAsset…

ubunt18.04安装ROS2

本文无废话&#xff0c;实现了ubunt18.04 下ros2的安装&#xff0c;并且同时兼容ros和ros2 如果想完ros&#xff08;1&#xff09;的&#xff0c;请参考我的前一篇文章&#xff1a;ubunt18.04安装ROS避坑指南 参考&#xff1a; https://blog.csdn.net/cau_weiyuhu/article/deta…

2024年【A特种设备相关管理(锅炉压力容器压力管道)】考试内容及A特种设备相关管理(锅炉压力容器压力管道)操作证考试

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 2024年A特种设备相关管理&#xff08;锅炉压力容器压力管道&#xff09;考试内容为正在备考A特种设备相关管理&#xff08;锅炉压力容器压力管道&#xff09;操作证的学员准备的理论考试专题&#xff0c;每个月更新的…

5.Godot节点和功能及Node节点属性分析

1. 节点和功能的关系 节点 Node &#xff0c;用于实现一种功能&#xff0c;例如&#xff0c;Sprite 节点&#xff0c;用于图片的显示一个节点的功能取决于它挂载了哪些子节点&#xff0c;它包含了哪些功能的子节点&#xff0c;就包含了对应子节点表示的功能节点是可选的&#…

Dota2 参议院

题目链接 Dota2 参议院 题目描述 注意点 senate[i] 为 ‘R’ 或 ‘D’假设每一位参议员都足够聪明&#xff0c;会为自己的政党做出最好的策略 解答思路 对于任意一位参议员&#xff0c;如果其有权利&#xff0c;当他后面没有另一方参议员&#xff0c;其会投票&#xff0c;…

小红书笔记写作方法和技巧分享,纯干货!

很多小伙伴感叹小红书笔记流量就是一个玄学&#xff0c;有时精心撰写的笔记却没有人看&#xff0c;自己随便写的笔记却轻轻松松上热门。实际上你还是欠点火候&#xff0c;小红书笔记写作是有一套方法和技巧的&#xff0c;总归是有套路的&#xff0c;如果你不知道&#xff0c;请…

C++ 数据结构 linux 【第一天】

1.命名空间 在C/C中&#xff0c;变量、函数和类都是大量存在的&#xff0c;这些变量、函数和类的名称将都存在于全局作 用域中&#xff0c;可能会导致很多冲突。使用命名空间的目的是对标识符的名称进行本地化&#xff0c;以避免命名冲突或名字污染&#xff0c;namespace关键字…

【MIT6.824】lab3 Fault-tolerant Key/Value Service 实现笔记

引言 lab3A的实验要求如下&#xff1a; Your first task is to implement a solution that works when there are no dropped messages, and no failed servers. You’ll need to add RPC-sending code to the Clerk Put/Append/Get methods in client.go, and implement Pu…

✌粤嵌—2024/4/12—插入区间✌

代码实现&#xff1a; 解题思路&#xff1a;先将数组 newInterval 插入到数组 intervals 的末尾&#xff0c;再转换成合并区间 /*** Return an array of arrays of size *returnSize.* The sizes of the arrays are returned as *returnColumnSizes array.* Note: Both returne…

组合预测 | Matlab实现ICEEMDAN-SMA-SVM基于改进完备集合经验模态分解-黏菌优化算法-支持向量机的时间序列预测

组合预测 | Matlab实现ICEEMDAN-SMA-SVM基于改进完备集合经验模态分解-黏菌优化算法-支持向量机的时间序列预测 目录 组合预测 | Matlab实现ICEEMDAN-SMA-SVM基于改进完备集合经验模态分解-黏菌优化算法-支持向量机的时间序列预测预测效果基本介绍程序设计参考资料预测效果 基本…

两个查国内产业信息新闻数据的必备网站

产业经济信息网&#xff1a;产业经济信息网由报业协会主管主办&#xff0c;成立于1997年&#xff0c;是由报业行业报委员会发起&#xff0c;几十家权威行业媒体共同组建的、国内最大的行业信息发布网站之一。网站所拥有的“产经数据库”容纳了54家行业媒体的信息数据200多万条&…

Nextjs学习入门 - 创建第一个项目

1 通过npx创建一个nextjs项目 通过命令创建&#xff1a; npx create-next-applatest 得到如下项目结构图&#xff1a; my-app- src //源代码目录- app //引用目录- favicon.ico //网站图标- globals.css //全局css- layout.tsx //布局文件- page.tsx //页面 路径"…

C语言C/S架构PACS影像归档和通信系统源码 医院PACS系统源码

C语言C/&#xff33;架构PACS影像归档和通信系统源码 医院PACS系统源码 医院影像科PACS系统&#xff0c;意为影像归档和通信系统。它是应用在医院影像科室的系统&#xff0c;主要的任务是把日常产生的各种医学影像&#xff08;包括核磁、CT、超声、各种X光机、各种红外仪、显微…

YOLO-World——S(cvpr2024)

文章目录 Abstract成果 MethodPre-training Formulation: Region-Text PairsModel ArchitectureYOLO DetectorText EncoderText Contrastive HeadTraining with Online VocabularyInference with Offline Vocabulary Re-parameterizable Vision-Language PANText-guided CSPLay…

JavaSE 有这一篇就够(呕心狂敲41k字,只为博君一点赞!)

目录 一. 基础语法 1. 数据类型 2. 基本数据类型转换 3. 运算符 3. 循环语句 5. 定义方法 6. 数组 二. 面向对象 1. 类和对象 2. 构造方法 3. 方法的重载 4. this关键字 5. static关键字 6. 代码块 7. 访问权限修饰符 8. 面向对象的三大特征 封装 继承…

开关到模拟量全覆盖钡铼IOy系列模块集成热电阻、热电偶等传感器

钡铼IOy系列模块作为一种创新的工业自动化解决方案&#xff0c;以其灵活的自由拼接设计和丰富的接口类型&#xff0c;在工业级DI/DO/AI/AO集成方案中扮演着重要角色。其中&#xff0c;其在集成热电阻、热电偶等传感器方面的能力更是为工业控制系统带来了全新的可能性。 开关到…

BNB链融合

BNB Chain融合 BNB Chain目前有BNB智能链&#xff08;BSC&#xff09;&#xff0c;BNB信标链 BNB信标链&#xff1a;用作质押和投票的治理层&#xff0c;采用BEP-2代币标准BNB智能链(BSC)&#xff1a;用作EVM兼容层&#xff0c;提供DApp、DeFi服务、共识层、多链支持和其他Web3…

NVIDIA NCCL 源码学习(十四)- NVLink SHARP

背景 上节我们介绍了IB SHARP的工作原理&#xff0c;进一步的&#xff0c;英伟达在Hopper架构机器中引入了第三代NVSwitch&#xff0c;就像机间IB SHARP一样&#xff0c;机内可以通过NVSwitch执行NVLink SHARP&#xff0c;简称nvls&#xff0c;这节我们会介绍下NVLink SHARP如…

EasyExcel追加写入数据,分批查询多次写入场景下,注意使用方式【OOM警告】

使用.withTemplate(file) 将临时数据文件和真实数据文件合并的方式&#xff0c;在生产环境大批量数据下&#xff0c;完全不可取&#xff0c;有很高的内存溢出风险 伪代码 public static void writeAppend(String fileName) {String filePath "tempDir".concat(Fil…