110.线程(创建、终止)

一、线程概述

◼ 与进程(process)类似,线程(thread)是允许应用程序并发执行多个任务的一种机
制。一个进程可以包含多个线程。同一个程序中的所有线程均会独立执行相同程序,且共
享同一份全局内存区域,其中包括初始化数据段、未初始化数据段,以及堆内存段。(传
统意义上的 UNIX 进程只是多线程程序的一个特例,该进程只包含一个线程)
◼ 进程是 CPU 分配资源的最小单位,线程是操作系统调度执行的最小单位。
◼ 线程是轻量级的进程(LWP:Light Weight Process),在 Linux 环境下线程的本
质仍是进程。
◼ 查看指定进程的 LWP 号:ps –Lf pid

二、线程和进程区别

◼ 进程间的信息难以共享。由于除去只读代码段外,父子进程并未共享内存,因此必须采用
一些进程间通信方式,在进程间进行信息交换。
◼ 调用 fork() 来创建进程的代价相对较高,即便利用写时复制技术,仍然需要复制诸如
内存页表和文件描述符表之类的多种进程属性,这意味着 fork() 调用在时间上的开销
依然不菲。
◼ 线程之间能够方便、快速地共享信息。只需将数据复制到共享(全局或堆)变量中即可。
◼ 创建线程比创建进程通常要快 10 倍甚至更多。线程间是共享虚拟地址空间的,无需采
用写时复制来复制内存,也无需复制页表。

 三、线程之间共享和非共享资源

四、创建线程

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

功能:创建一个子线程

参数:

         - thread:传出参数,线程创建成功后,子线程的线程ID被写到该变量

         - attr:设置线程的属性,一般用默认值,NULL

         - start_routine:函数指针,这个参数是子线程需要处理的逻辑代码

         - arg:给第三个参数使用,传参

- 返回值:

         成功:0

         失败:返回错误号,这个错误号和之前errno不一样

 示例代码:

#include <stdio.h>
#include <pthread.h>
#include <string.h>
#include <unistd.h>void *callback(void *arg)
{printf("child thread....\n");printf("arg value :%d\n", *(int *)arg);return NULL;
}int main()
{pthread_t tid;int num = 10;// 创建一个子线程int ret = pthread_create(&tid, NULL, callback, (void *)&num);if (ret != 0){char *errstr = strerror(ret);printf("error:%s", errstr);}for (int i = 0; i < 5; i++){printf("%d\n", i);}sleep(1);return 0;
}

 五、终止线程

1.pthread_exit 函数用于终止调用它的线程。它允许线程返回一个指针作为退出状态(类似于进程的退出状态)。

void pthread_exit(void *retval);
  • retval:指定线程的退出状态,这个指针的值将被传递给任何等待该线程的线程。通常,这个指针可以指向一个在堆上动态分配的内存块,或者是某个静态或全局变量的地址。

调用 pthread_exit 的线程将立即退出,不会执行后续的代码。线程的退出状态将被设置为 retval 指定的值。

2.pthread_self用于获取子线程的id

以下是一个简单的示例,演示了 pthread_exitpthread_self 的用法:

#include <stdio.h>
#include <pthread.h>
#include <string.h>void *callback(void *arg)
{printf("child pthread id:%ld\n", (long)pthread_self());return NULL;
}int main()
{pthread_t tid;int ret = pthread_create(&tid, NULL, callback, NULL);if (ret != 0){char *errstr = strerror(ret);printf("error: %s\n", errstr);return 1;}// 主线程for (int i = 0; i < 5; i++){printf("%d\n", i);}printf("tid:%ld, main thread id:%ld\n", (long)tid, (long)pthread_self());// 等待子线程结束pthread_exit(NULL);return 0;
}

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

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

相关文章

低抖动可编程SPXO SG-8200CG, SG-8201CG -高稳定性和低抖动特性

描述 SG-8200CG和SG-8201CG (sg -8201系列)利用爱普生新的低噪声分n锁相环技术&#xff0c;与上一代爱普生可编程晶体振荡器相比&#xff0c;稳定性提高了约2x&#xff0c;相位抖动降低了<1/25。sg -8201系列可编程为1.2MHz至170MHz的任何频率&#xff0c;工作温度范围可达…

C#,背包问题(Knapsack Problem)贪心算法的源代码

背包问题&#xff08;KnapSack Problem&#xff09;的相关算法是常用的规划算法。 一、什么是背包问题&#xff1f; 背包的问题是&#xff0c;你有一个“袋子”&#xff0c;可以装有限数量的物品&#xff0c;鉴于你有一组物品可以从每个物品中选择&#xff0c;每个物品都有各自…

Spring基于注解的AOP控制事务

首先在.xml中开启sprong对注解事务的支持 applicationContext.xml <tx:annotation-driven transaction-manager"transactionManager"/> 然后再Service中加上注解 service Service Transactional(readOnlytrue,propagation Propagation.SUPPORTS) public cl…

MySQL高可用解决方案演进:从主从复制到InnoDB Cluster架构

&#x1f482; 个人网站:【 海拥】【神级代码资源网站】【办公神器】&#x1f91f; 基于Web端打造的&#xff1a;&#x1f449;轻量化工具创作平台&#x1f485; 想寻找共同学习交流的小伙伴&#xff0c;请点击【全栈技术交流群】 当谈论MySQL高可用性解决方案时&#xff0c;从…

java中实现对文件高效的复制

不多说我们直接上代码&#xff1a; 这个是使用NIO包下的FileChannel和ByteBuffer进行文件的操作的&#xff0c;会比较高效。

计算机毕业设计 基于SpringBoot的公司资产网站的设计与实现 Java实战项目 附源码+文档+视频讲解

博主介绍&#xff1a;✌从事软件开发10年之余&#xff0c;专注于Java技术领域、Python人工智能及数据挖掘、小程序项目开发和Android项目开发等。CSDN、掘金、华为云、InfoQ、阿里云等平台优质作者✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精…

深入理解Java源码:提升技术功底,深度掌握技术框架,快速定位线上问题

为什么要看源码&#xff1a; 1、提升技术功底&#xff1a; 学习源码里的优秀设计思想&#xff0c;比如一些疑难问题的解决思路&#xff0c;还有一些优秀的设计模式&#xff0c;整体提升自己的技术功底 2、深度掌握技术框架&#xff1a; 源码看多了&#xff0c;对于一个新技术…

【hyperledger-fabric】使用couchDB

简介 本文章主要参考来自于官方文档使用CouchDB以及 https://www.bilibili.com/video/BV1Li4y1f7ex/?spm_id_frompageDriver&vd_source2c5f2831e1c63d3a20045b167ae044e6 B站视频&#xff0c;还是非常感谢up主提供了学习的思路。 为什么要使用couchDB&#xff1f; 原文…

Qt 三维柱状图 Q3DBar 和 三维条形图中的数据序列 QBar3DSeries

(一) 使用 Q3DBars 图形类和 QBar3DSeries 序列类可以绘制三维柱状图 窗口右侧是用 Q3DBars 和 QBar3DSeries 绘制的三维柱状图&#xff0c;这个图只有一个QBar3DSeries序列&#xff0c;数据是按行存储的&#xff0c;可以有多行。水平方向是行坐标轴和列坐标轴&#xff0c;使用…

实战案例!风控实战催收评分卡(附 Python 源码)

在风控环节中&#xff0c;传统观念A卡为主、B卡C卡为辅&#xff0c;但是在市场逐步饱和、政策利率要求越来越低的背景下&#xff0c;B卡和C卡也越来越重要。 本文以简易贷后数据实战催收评分模型&#xff0c;预测在用户逾期后、未来能否催回。 一、数据读取 数据来源某比赛网…

低压 5V 全桥驱动芯片GC9114 ,适用于摄像机、消费类等产品上

GC9114 是一款低压 5V 全桥驱动芯片&#xff0c;为摄像机、消费类产品、玩具和其他低压或者电池供电的运动控制类应用提供了集成的电机驱动解决方案。 GC9114 能提供高达 1.3A 的持续输出电流。可以工作在 2~6V 的电源电压上。具有 PWM&#xff08;IN/IN&#xff09;输入接口,与…

一文详解VScode 的远程开发

VS code登录服务器后进行编码和调试&#xff0c;VS code上的所有功能都可以使用&#xff0c;和在本地开发基本无区别。 一、配置免密远程登录 因为是要远程登录&#xff0c;那么需要通过使用ssh进行密钥对登录&#xff0c;这样每次登录服务器就可以不用输入密码了。 先来一句官…