110.线程(创建、终止)

news2024/12/26 10:59:47

一、线程概述

◼ 与进程(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.coloradmin.cn/o/1368646.html

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

相关文章

NR HARQ-RTT-Timer和DRX RetransmissionTimer

这两个timer关联度比较高&#xff0c;放在一起看会比较清楚。 HARQ-RTT-Timer 对于同一个HARQ进程&#xff0c;当一次上行调度或下行调度&#xff0c;到下一次调度&#xff0c;需要一定的处理时间&#xff0c;这个时长就是HARQ RTT(Round Trip Timer)时间&#xff1b; 在NR …

【CUDA】windows下的CUDA安装

一、前言 windows10 下安装 CUDA &#xff0c;首先需要下载安装包&#xff1a; CUDA toolkit&#xff08;工具包&#xff09; 二、安装前的准备 电脑环境检查 通过cmd&#xff0c;输入nvidia-smi 查看自己的驱动版本和支持的CUDA版本&#xff0c;如下图红圈标记位置 下载 …

vue购物车案例、v-model进阶、与后端交互

一 购物车案例 - 结算 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>购物车结算</title><script src"https://cdn.bootcdn.net/ajax/libs/vue/2.6.12/vue.min.js"></scr…

四川思维跳动:抖音能不能根据弹幕找到人?

在抖音这样的社交媒体平台上&#xff0c;用户可以通过发布抖音短视频与其他用户互动和交流。其中&#xff0c;弹幕是一种常见的互动方式&#xff0c;用户可以通过发送弹幕来表达对视频的评论、喜爱或者提问。然而&#xff0c;有用户担心自己的隐私可能因为弹幕内容被泄露&#…

新手搭建知识付费平台必备攻略:如何以低成本实现高转化?

明理信息科技知识付费saas租户平台 一、引言 随着知识经济的崛起&#xff0c;越来越多的知识提供者希望搭建自己的知识付费平台。然而&#xff0c;对于新手来说&#xff0c;如何以低成本、高效率地实现这一目标&#xff0c;同时满足自身需求并提高客户转化率&#xff0c;是一…

AI大语言模型会带来了新一波人工智能浪潮?

以ChatGPT、LLaMA、Gemini、DALLE、Midjourney、Stable Diffusion、星火大模型、文心一言、千问为代表AI大语言模型带来了新一波人工智能浪潮&#xff0c;可以面向科研选题、思维导图、数据清洗、统计分析、高级编程、代码调试、算法学习、论文检索、写作、翻译、润色、文献辅助…

万能字符单词拼写 - 华为OD统一考试

OD统一考试(C卷) 分值: 100分 题解: Java / Python / C++ 题目描述 有一个字符串数组 words 和一个字符串 chars。假如可以用 chars 中的字母拼写出 words 中的某个"单词"(字符串),那么我们就认为你掌握了这个单词。 words 的字符仅由 a-z 英文小写宁母组成,…

认知能力测验,⑥如何破解逻辑判断类测试题?

逻辑思维&#xff0c;是一个比较大的范围&#xff0c;在绝大多数的招聘中&#xff0c;认知能力测评形式多样&#xff0c;难度也较大&#xff0c;其中逻辑判断题型所涉及到的分类为&#xff1a;概念类、条件类、矛盾类、数字类、图形类等知识。比如奥数就是个好东西.....如果经历…

2024年01月微软更新Bug 已解决 !Explorer.EXE 提示:Windows无法访问指定设备、路径或文件。你可能没有适当的权限访问该项目。

前倾概要 近期大量出现如上图问题&#xff0c;杀毒&#xff0c;系统急救箱都没反应&#xff0c;罪魁祸首就是微软更新&#xff01; 点击什么都是&#xff1a;Windows无法访问指定设备、路径或文件。你可能没有适当的权限访问该项目。 但软件使用正常&#xff0c;还能通过建立…

8年经验之谈!一文看懂性能测试的流程!

每天做着点点点测试有没有危机感&#xff1f; 突然有一天&#xff0c;领导说&#xff1a;“小王&#xff0c;今天把996福报系统压一下&#xff0c;下班前把压测报告发我邮箱。” 啥&#xff1f;压测&#xff1f;今天&#xff1f;报告&#xff1f;怎么压&#xff1f;怎么写&am…

javaweb基础----JDBC(一)

一、什么是JDBC JDBC全称为Java数据库连接(Java Database Connectivity),是一套用于执行SQL语句的Java API。应用程序可以通过这套API连接到关系型数据库&#xff0c;并使用SQL语句完成对数据中数据的查询、增加、更新和删除等操作。 JDBC在应用程序与数据库之间起到了一个桥…

性能分析与调优: Linux 使用 iperf3 进行TCP网络吞吐量测试

目录 一、实验 1.环境 2.TCP网络吞吐量的微观基准测试 二、问题 1.iperf参数有哪些 2.iperf如何二进制安装 一、实验 1.环境 &#xff08;1&#xff09;主机 表1-1 主机 主机架构组件IP备注prometheus 监测 系统 prometheus、node_exporter 192.168.204.18grafana监测…

BI工具调研

1、前言 目前公司使用Tableau作为BI工具&#xff0c;但是感觉不是很好用&#xff0c;且国内市场已经不维护了&#xff0c;所以打算换下BI工具&#xff0c;因此需要针对当前市场开源和商业的BI工具进行调研&#xff0c;看看是买商业的还是用开源的。 基于以下部分开源的做了一个…

深度学习——R-CNN目标检测原理

R-CNN系列算法需要先产生候选区域&#xff0c;再对候选区域做分类和位置坐标的预测&#xff0c;这类算法被称为两阶段目标检测算法。近几年&#xff0c;很多研究人员相继提出一系列单阶段的检测算法&#xff0c;只需要一个网络即可同时产生候选区域并预测出物体的类别和位置坐标…

Jmeter 性能压测 —— 常遇问题与解决技巧!

问题1&#xff1a;如何在大并发测试下&#xff0c;让登录或者后续接口只执行一次&#xff1f; 分析&#xff1a; 这个问题网上的答案其实很多&#xff0c;但是大多不靠谱。 比如推荐使用仅一次控制器&#xff0c;但是仅一次控制器对线程组无效&#xff1b; 比如推荐跨线程组…

OpenAI ChatGPT-4开发笔记2024-05:windows下anaconda中设置visual studio code workspace

这里写自定义目录标题 1 安装anaconda和vscode2 Create an Anaconda Environment3 select Python Interpreter4 Workspace5 Open Workspace With File6 开发文件夹加入workspace7 美化 1 安装anaconda和vscode 标配。 2 Create an Anaconda Environment conda create --name…

Python+Flask+MySQL的图书馆管理系统【附源码,运行简单】

PythonFlaskMySQL的图书馆管理系统【附源码&#xff0c;运行简单】 总览 1、《图书馆管理系统》1.1 方案设计说明书设计目标需求分析工具列表 2、详细设计2.1 登录2.2 注册2.3 程序主页面2.4 图书新增界面2.5 图书信息修改界面2.6 普通用户界面2.7 其他功能贴图 3、下载 总览 …

网站被挂黑链怎么办

网站被挂黑链这种事情总是防不胜防&#xff0c;且不说网站本身的安全防护做的是否到位&#xff0c;但只要被盯上了就难逃厄运。即使是企业机构的网站也难逃被黑的经历&#xff0c;更何况用户苦心经营的网站&#xff0c;因此首先需要正确看待挂黑链这个现象&#xff0c;网站被挂…

Java进击框架:Spring-Web(八)

Java进击框架&#xff1a;Spring-Web&#xff08;八&#xff09; 前言DispatcherServlet拦截器异常视图解析重定向转发 语言环境日志 过滤器带注释的控制器声明映射请求其它注解验证 功能性端点URI Links异步请求CORSHTTP缓存视图技术MVC配置其他Web框架 前言 Spring Web MVC是…

前端学习笔记 6:Pinia

前端学习笔记 6&#xff1a;Pinia Pinia 是 Vue 的一个官方库&#xff0c;用于状态管理。 1.安装 首先创建一个 Vue3 项目&#xff0c;具体方式可以参考这里。 安装 Pinia&#xff1a; npm install pinia创建一个 pinia 实例 (根 store) 并将其传递给应用&#xff1a; im…