Linux多线程基础(1):创建线程

在大家的关注与陪伴下,前些日子我们已将网络通信基础专栏更新完毕,包括网络编程基础中所有函数的工作原理以及使用方法,感兴趣的同学欢迎查看.从今天开始,我们一起正式进入linux系统下多线程多进程的学习.

0.为什么要使用线程

想象一下,如果你需要构建一个火车站售票系统,在面对巨大的人流量时,能够高效、快速地处理所有的购票请求。我们可能的思路是构建一个售票函数,并在主函数调用他.这相当于仅仅创建了一个售票窗口,无法满足高效、快速的性能.如果可以设置多个售票窗口同时运行,这效率不久可以嘎嘎提高了吗.这就是线程的作用,每个线程相当于一个售票系统.

1.线程的定义

线程是程序中负责执行的实体,或者说是进程的子任务。线程是操作系统能够进行运算调度的最小单位,被包含在进程之中,是进程中的实际运作单位。一个进程至少要有一个线程,即主线程,也可以有多个线程,即创建子线程。线程可以看作是轻量级的进程,除了栈之外,没有自己独立的内核资源。

要使用线程,需要包含头文件:

#include<pthread.h>

线程的函数定义:
 

int pthread_create(pthread_t *thread, const pthread_attr_t *attr,  void *(*start_routine) (void *), void *arg);

其中:

thread:线程标识符指针;

attr:线程属性指针,如堆栈大小、是否分离等,通常设为NULL,表示默认属性;

start_routine:线程运行函数的起始地址, 注意函数的类型:void *(*start_routine) (void *)

arg:传递给线程函数的参数,可传入NULL(ps:这个参数是void类型的,一般需要使用void *将参数强制转换)

2.举例

// 引入所需的头文件,这些文件提供了多线程编程所需的各种功能和数据类型  
#include <pthread.h>    
#include <string.h>  
#include <stdio.h> 
#include <unistd.h>   
#include <stdlib.h>  
#include <iostream>  
// 定义第一个线程的执行函数  
void *pth1(void* str) {  std::cout << "第一个线程" << std::endl;    pthread_exit(0);  // 退出当前线程,并返回一个值(在这种情况下为0)  
}  
// 定义第二个线程的执行函数  
void *pth2(void* str) {  std::cout << "第二个线程" << std::endl;   pthread_exit(0);   // 退出当前线程,并返回一个值(在这种情况下为0)  
}  
// 主函数  
int main(void) {  // 定义两个线程的标识符  pthread_t thread1, thread2;  // 创建第一个线程,并执行 pth1 函数  pthread_create(&thread1, NULL, pth1, NULL);  // 创建第二个线程,并执行 pth2 函数  pthread_create(&thread2, NULL, pth2, NULL);  // 等待第一个线程结束(如果它还在运行的话)  pthread_join(thread1, NULL);  // 当第一个线程退出后,输出“第一个线程退出”  std::cout << "第一个线程退出" << std::endl;  // 等待第二个线程结束(如果它还在运行的话)  pthread_join(thread2, NULL);  // 当第二个线程退出后,输出“第二个线程退出”  std::cout << "第二个线程退出" << std::endl;  std::cout << "主函数退出" << std::endl;  
}

这个例子中有很多还没有讲到的函数,大家不用慌,后续都会讲到,这篇文章仅需要你知道如何创建线程即可.

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

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

相关文章

OpenCV图像处理|1.1 OpenCV介绍与环境搭建

1.1.1 介绍 OpenCV&#xff08;Open Source Computer Vision Library&#xff09;开放源代码计算机视觉库&#xff0c;主要算法涉及图像处理、计算机视觉和机器学习相关方法。OpenCV 其实就是一堆 C 和 C语言的源代码文件&#xff0c;这些源代码文件中实现了许多常用的计算机视…

安装PyTorch及环境配置(应用于Python上的YOLO)

这个基本都是Bilibili网站里面叫“小手丫子”up的视频教程&#xff0c;此前自己需要装了好几次又卸载了好几次&#xff0c;现在根据视频教学整理出来自己所理解的文档。 注意事项 1.安装的pycharm版本和anaconda版本无要求。 2.运行pycharm尽量以管理员身份运行。 3.Cuda是独…

AWTK 开源串口屏开发(5) - MCU端 SDK 用法

AWTK 开源智能串口屏&#xff0c;不但开放了串口屏端全部源码&#xff0c;还提供了MCU 端 SDK&#xff0c;大大加快 MCU 软件的开发。本介绍一下 MCU 端 SDK 在不同平台上的用法。 完整示例可以参考下面的几个例子&#xff1a; 普通嵌入式系统 mcu/stm32/hmi_app/hmi_app.c 低…

docker +gitee+ jenkins +maven项目 (二)

文章目录 前言一、创建Maven项目二、常规配置1.gitee配置2.gitee仓库配置3.构建时操作4.构建后操作 总结 前言 上一篇文章介绍了Jenkins的环境配置和工具配置&#xff0c;这篇进行具体maven项目的配置 一、创建Maven项目 二、常规配置 1.gitee配置 在工具哪里配置好gitee后&…

设计模式② :交给子类

文章目录 一、前言二、Template Method 模式1. 介绍2. 应用3. 总结 三、Factory Method 模式1. 介绍2. 应用3. 总结 参考内容 一、前言 有时候不想动脑子&#xff0c;就懒得看源码又不像浪费时间所以会看看书&#xff0c;但是又记不住&#xff0c;所以决定开始写"抄书&qu…

JMeter之测试WebService接口

JMeter之测试WebService接口 1 背景2 目的3 介绍4 具体操作4.1 soapUI调用4.2 JMeter工具调用4.3 操作步骤流程4.3 重点 1 背景 WebService应用的范围是非常广&#xff0c;任何需要跨平台、跨系统进行数据交换和功能调用的场景都可以用此来实现&#xff0c;在实际的工作中也常常…

Unity中Shader的_Time精度问题

文章目录 前言一、U方向上优化二、V方向上优化在这里插入图片描述 三、最终代码1、效果2、Shader 前言 在Unity的Shader中&#xff0c;使用了_Time来达到UV的流动效果&#xff0c;普遍会出现一个问题。我们的UV值会随着时间一直增加&#xff08;uv值增加了&#xff0c;但是因为…

Webpack5 常用优化总结

本文主要总结经常用到的一些代码性能优化、减小代码体积、提升webpack打包构建速度等内容的方法。具体的实现可参考webpack官网查看相关示例。 注&#xff1a;如果读者还未接触过webpack&#xff0c;请先了解webpack的基本使用。 正文&#xff1a; SourceMap ---- 提升开发体…

3元一平方公里的在线卫星影像

我们为大家分享了免费下载卫星影像的方法。 但让人遗憾的是&#xff0c;该影像的最高分辨率只有10米&#xff0c;需要更高清且比较新的卫星影像&#xff0c;看来还是得付费购买才比较靠谱。 自助选择区县范围 商业卫星影像主要面向企事业单位&#xff0c;一般来讲都比较贵&a…

0-自然语言处理基础知识

目录 1 transformers1.1 什么是transformers1.2 优缺点和使用场景是什么&#xff1f;优点缺点使用场景 1 transformers 1.1 什么是transformers transformers 是由 Hugging Face 团队开发的一个非常流行的开源库&#xff0c;它为自然语言处理&#xff08;NLP&#xff09;提供…

55、交叉熵损失函数和softmax

上一节介绍了softmax函数,这里插一篇关于损失函数的介绍,看一看softmax和损失函数是如何结合的。 在很多分类任务中,损失函数使用的是交叉熵损失。 作为一种损失函数,它的重要作用便是可以将“预测值”和“真实值(标签)”进行对比,从而输出 loss 值,直到 loss 值收敛,…

Windows安装DolphinDB,配置单节点启动与GUI

1. 安装Java 首先&#xff0c;进入网址&#xff1a;jdk11 下载jdk-11.0.20_windows-x64_bin.exe&#xff0c;然后安装即可 安装完成后&#xff0c;打开命令提示符&#xff0c;输入&#xff1a; java javac如果这两个命令都出现一大堆东西&#xff0c;而不是找不到指令的提示的…

智创有术软件开发公司:开发完整流程--------整体介绍

智创有术&#xff0c;深耕互联网领域八年&#xff0c;软件开发、平台运营、营销推广、整套解决方案&#xff0c;以“让产品更有价值”为自身使命&#xff0c;打造以原创开发为核心的技术生态体系。 作为一名软件开发工程师,我们需要了解在软件开发过程中的开发流程&#xff0c…

物联网云平台源码,Spring Cloud智慧工地源码,建筑施工智能化管理

智慧工地以物联网云平台为核心&#xff0c;基于智慧工地物联网云平台与现场多个子系统的互联&#xff0c;实现现场各类工况数据采集&#xff0c;存储、分析与应用。通过接入智慧工地物联网云平台的多个子系统板块&#xff0c;根据现场管理实际需求灵活组合&#xff0c;实现一体…

玩转Python:用Python处理文档,5个必备的库,特别实用,附代码

在Python中&#xff0c;有几个流行的库用于处理文档&#xff0c;包括解析、生成和操作文档内容。以下是一些常用的库及其简介和简单的代码示例&#xff1a; PyPDF2 - 用于处理PDF文件。 简介&#xff1a;PyPDF2是一个纯Python库&#xff0c;用于分割、合并、转换和提取PDF文件中…

Pod的生命周期

Pod生命周期 pod创建过程运行初始化容器(init container)过程运行主容器(main container)过程 容器启动后钩子(post start)、容器终止前钩子(pre stop) 容器的存活性探测(Liveness probe)、就绪性探测(readiness probe)pod终止过程在整个生命周期中,Pod会出现5种…

深入理解JVM虚拟机--3.3垃圾收集算法

深入理解JVM虚拟机--3.3垃圾收集算法 1 标记-清除算法&#xff0c;算法分为“标记”和“清除”两个阶段&#xff1a;首先标记出所有需要回收的对象&#xff0c;在标记完成后统一回收所有被标记的对象&#xff0c;它的标记过程其实在前一节讲述对象标记判定时已经介绍过了。 它…

Vary: Scaling up the Vision Vocabulary for Large Vision-Language Models

ABSTRACT 现代大规模视觉-语言模型&#xff08;LVLMs&#xff09;采用了相同的视觉词汇-CLIP&#xff0c;可以涵盖大多数常见的视觉任务。然而&#xff0c;对于一些需要密集和细粒度视觉感知的特殊视觉任务&#xff0c;例如文档级OCR或图表理解&#xff0c;尤其是在非英语环境…

react:ffcreator中FFCreatorCenter视频队例

最近项目要求,一键生成房子的推荐视频,选几张图,加上联系人的方式就是一个简单的视频,因为有web端、小程序端,为了多端口用,决定放在服务器端生成。 目前用的是react中的nextjs来开发项目。 nextjs中怎样用ffcreator上一章有讲到过,这里不再详细说了,考虑多端口用,并…

卷积神经网络(CNN)、循环神经网络(RNN)和自注意力(self-attention)对比

考虑同一个的问题&#xff1a;将由个词元组成的序列映射到另一个长度相同的序列&#xff0c;其中的每个输入词元或输出词元由维向量表示。 我们将比较能够解决上述问题的三种常用方法&#xff1a;卷积神经网络&#xff08;CNN&#xff09;、循环神经网络&#xff08;RNN&#x…