Linux系统上使用C语言创建线程

文章目录

  • 一、使用C代码创建线程
    • 示例
    • API
  • 二、线程的相关知识
    • 2.1 线程 与 进程 的关系
    • 2.2 使用线程的理由

一、使用C代码创建线程

使用pthread_create函数创建线程。

示例

示例:创建一个线程,其作用就是打印线程ID和传入参数。

//demo1
#include <stdio.h>
#include <pthread.h>void* fun1(void *arg)
{printf("t1:%ld thread is create\n", (unsigned long)pthread_self());//pthread_self()打印线程IDprintf("t1: %d\n", *((int*)arg));//函数执行结束,会默认调用 pthread_exit
}int main()
{//int pthread_create(pthread_t *restrict tidp, const pthread_attr_t *restrict attr, void *(*start_rtn)(void *), void *restrict arg);int ret;int param = 100;pthread_t t1;//1.创建线程//                       线程属性 线程函数 线程函数参数ret = pthread_create(&t1, NULL, fun1, (void*)&param);if(ret == 0){printf("main:create t1 success\n");} else {perror("why t1 fail");}printf("main:%ld\n", (unsigned long)pthread_self());//打印主线程ID//2.等待线程pthread_join(t1, NULL);//等待线程结束,防止进程结束,线程还未执行完毕return 0;
}

API

#include <pthread.h>
int pthread_create(pthread_t *restrict tidp, const pthread_attr_t *restrict attr, void *(*start_rtn)(void *), void *restrict arg);
// 返回:若成功返回0,否则返回错误编号

当pthread_create成功则返回0,函数参数:

  1. tidp 指向的内存单元被设置为新创建线程的线程ID。
  2. attr 参数用于定制各种不同的线程属性,暂可以把它设置为 NULL,以创建默认属性的线程。(工作中也多用NULL)
  3. 新创建的线程从 start_rtn(函数指针)函数的地址开始运行,该函数只有一个无类型指针参数 arg
  4. 如果需要向 start_rtn 函数传递的参数不止一个,那么需要把这些参数放到一个结构中,然后把这个结构的地址作为 arg 参数传入。

pthread_join函数的作用是等待,效果上看是等待线程的执行过程,只有线程执行完毕,才会继续执行下去。可以在fun1函数最后添加while1的死循环来验证:程序不会退出,因为线程一直卡在循环处。感兴趣可以多创建一个t2线程来体验pthread_join函数的作用,一个函数中不带死循环,一个函数中带死循环,都使用pthread_join函数进行等待。

二、线程的相关知识

2.1 线程 与 进程 的关系

线程是操作系统能够进行运算调度的最小单位。它被包含在进程之中,是进程中的实际运作单位。一条进程指的是一个单一顺序的控制流,一个进程中可以并发多个线程,每条线程并发执行不同的任务。线程包含了表示进程内执行环境必须的信息,其中包括进程中表示线程的 线程ID、一组寄存器值、栈、调度优先级和策略、信号屏蔽字、errno常量以及线程私有数据。进程的所有信息对所有线程都是共享的,包括可执行的程序文本、程序的全局变量和堆内存、栈以及文件描述符。在Unix和类Unix操作系统中线程也被称为轻量级进程(lightweight process),但轻量级进程更多指的是内核线程(kernel thread),而把用户线程(user thread)称为线程。

  • 进程——资源分配的最小单位
  • 线程——程序执行的最小单位

进程有独立的地址空间,一个进程崩溃后,在保护模式下不会对其他进程产生影响,而线程只是一个进程中的不同执行路径。线程有自己的堆栈和局部变量,但没有独立的地址空间,一个线程死掉就等于整个进程死掉,所以多进程程序比多线程程序健壮,但切换进程时,资源耗费比较大,效率差一些。但对于要求同时进行且又需要共享变量的并发操作,只能使用线程,不能使用进程。

2.2 使用线程的理由

从上面我们知道了进程与线程的区别,其实这些区别也就是我们使用线程的理由。总的来说就是:进程有独立的地址空间,线程没有独立的地址空间(同一进程内的线程共享进程的地址空间)。

使用多线程的理由之一是和进程相比,它是一种非常“节俭”的多任务处理方式。我们知道,在Linux系统下,启动一个新的进程必须分配给它独立的地址空间,建立众多的数据表来维护它的代码段、堆栈段和数据段,这是一种"昂贵"的多任务工作方式。而运行于一个进程中的多个线程,它们彼此之间使用相同的地址空间,共享大部分数据,启动一个线程所花费的空间远远小于启动一个进程所花费的空间,而且,线程间彼此切换所需的时间也远远小于进程间切换所需要的时间。据统计,总的说来,一个进程的开销大约是一个线程开销的30倍左右,当然,在具体的系统上,这个数据可能会有较大的区别。

使用多线程的理由之二是线程间方便的通信机制。对不同进程来说,它们具有独立的数据空间,要进行数据的传递只能通过通信的方式进行,这种方式不仅费时,而且很不方便。线程则不然,由于同一进程下的线程之间共享数据空间,所以一个线程的数据可以直接为其它线程所用,这不仅快捷,而且方便。当然,数据的共享也带来其他一些问题,有的变量不能同时被两个线程所修改,有的子程序中声明为static的数据更有可能给多线程程序带来灾难性的打击,这些正是编写多线程程序时最需要注意的地方。

多线程程序作为一种多任务、并发的工作方式,有以下的优点:

  • 提高应用程序响应。这对图形界面的程序尤其有意义,当一个操作耗时很长时,整个系统都会等待这个操作,此时程序不会响应键盘、鼠标、菜单的操作,而使用多线程技术,将耗时长的操作(time
    consuming)置于一个新的线程,可以避免这种尴尬的情况。
  • 使多CPU系统更加有效。操作系统会保证当线程数不大于CPU数目时,不同的线程运行于不同的CPU上。
  • 改善程序结构。一个既长又复杂的进程可以考虑分为多个线程,成为几个独立或半独立的运行部分,这样的程序会利于理解和修改。

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

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

相关文章

cookie和session对http的作用以及区别

HTTP协议本身是无法判断用户身份。所以需要cookie或者session。 1、什么是cookie&#xff1f; cookie 是由 Web 服务器保存在用户浏览器上的文件&#xff08; key-value 格式&#xff09;&#xff0c;可以包含用户相关的信 息。客户端向服务器发起请求&#xff0c;就提取浏览器…

基于串流技术的p2p共享桌面共享方案

研究远控有一定时间了&#xff0c;但真正落地运用的不多&#xff0c;所以也不太上心&#xff0c;平时也只是自己diy玩玩&#xff0c;远程共享看看电视剧。 最近生成式ai大火&#xff0c;直接带动了gpu应用的相关场景&#xff0c;相关场景&#xff0c;但gpu卡又贵&#xff0c;对…

[记录]-cannot import name ‘prelu‘ from ‘lasagne.layers‘

问题&#xff1a;cannot import name prelu from lasagne.layers 现有版本&#xff1a;lasagne 0.1,需要更新版本&#xff0c;直接pip installLasagne0.2 目前还不行 需要去源码下载 命令&#xff1a; pip install --upgrade https://github.com/Theano/Theano/archive/mas…

每日一题——LeetCode1556.千位分隔符

方法一 个人方法&#xff1a; 把n转为字符串&#xff0c;逆序遍历n&#xff0c;把n的每个元素加入res&#xff0c;每三次加入.&#xff0c;最后将res翻转再转为字符串即为符合题目要求的结果 var thousandSeparator function(n) {nlet res[],lenn.length-1for(let ilen;i>…

LibreOJ 136. 最小瓶颈路 题解 最小生成树 倍增

题目链接&#xff1a;LibreOJ 136. 最小瓶颈路 题目描述&#xff1a; 给定一张无向图&#xff0c;询问两个结点之间的最小瓶颈路。u和v两个结点之间最小瓶颈路指的是u和v的每条路径中经过的最大边权的最小值。 题解&#xff1a; 给出结论&#xff1a;无向图的最小瓶颈路与其最小…

iptables学习

iptables的4表5链的处理流程 一&#xff1a;业务地址请求服务时&#xff0c;首先经过iptables服务&#xff0c;iptables通过校验规则&#xff0c;通过校验是否同意业务访问&#xff0c;规则从上到下&#xff0c;匹配规则都失败了的话&#xff0c;走默认规则 &#xff08;1&…

202435读书笔记|《半小时漫画中国史》——读点经济学与历史,生活更美好,趣味烧脑土地制度、商鞅变法、华丽丽的丝绸之路这里都有

202435读书笔记|《半小时漫画中国史》——读点经济学与历史&#xff0c;生活更美好&#xff0c;趣味烧脑土地制度、商鞅变法、华丽丽的丝绸之路这里都有 1. 土地政策、度量衡及税收2. 商鞅变法3. 西汉经济4. 西汉盐铁大辩论5. 西汉丝绸之路 《半小时漫画中国史&#xff1a;经济…

五子棋裁判

描述 在程序设计实践课上&#xff0c;老师给大家布置下了这样的实验任务&#xff1a;编写一个五子棋应用程序 胜负判定是五子棋程序最核心的部分。给出当前棋盘的状态&#xff0c;请你完成对五子棋胜负的判定&#xff08;仅考虑当前状态&#xff0c;不考虑后续落子&#xff0…

Typora快捷键设置详细教程(内附每个步骤详细截图)

&#x1f60e; 作者介绍&#xff1a;我是程序员洲洲&#xff0c;一个热爱写作的非著名程序员。CSDN全栈优质领域创作者、华为云博客社区云享专家、阿里云博客社区专家博主、前后端开发、人工智能研究生。公粽号&#xff1a;程序员洲洲。 &#x1f388; 本文专栏&#xff1a;本文…

在vue2中使用饼状图

1.引入vue2和echarts <script src"https://cdn.jsdelivr.net/npm/vue2.7.14/dist/vue.js"></script> <script src"https://cdn.jsdelivr.net/npm/echarts5.4.0/dist/echarts.min.js"></script> 2.1 补充基本的body内容 <div id…

存储过程基本了解

文章目录 介绍存储过程示例1. 目的2. 输入参数3. 输出参数4. 执行逻辑5. 返回值6. 示例用法7. 注意事项 存储过程的关键字有哪些简单实操 介绍 存储过程是一组预编译的SQL语句&#xff0c;以及流程控制语句&#xff0c;封装在数据库服务器中并可以被重复调用。它们可以接收参数…

5G 网络建设【华为OD机试-JAVAPythonC++JS】

题目描述 现需要在某城市进行5G网络建设&#xff0c;已经选取N个地点设置5G基站&#xff0c;编号固定为1到N&#xff0c;接下来需要各个基站之间使用光纤进行连接以确保基站能互联互通&#xff0c;不同基站之间架设光纤的成本各不相同&#xff0c;且有些节点之间已经存在光纤相…

CentOS7安装MySQL5.7

查看并卸载系统自带的 Mariadb rpm -qa|grep mariadb rpm -e --nodeps mariadb-libs-5.5.68-1.el7.x86_64 检查系统是否安装过MySQL rpm -qa | grep mysql 检查有无MySQL用户组 cat /etc/group | grep mysql cat /etc/passwd | grep mysql 创建MySQL用户组和用户 groupadd m…

特斯拉一面算法原题

来自太空的 X 帖子 埃隆马斯克&#xff08;Elon Musk&#xff09;旗下太空探索技术公司 SpaceX 于 2 月 26 号&#xff0c;从太空往社交平台 X&#xff08;前身为推特&#xff0c;已被马斯克全资收购并改名&#xff09;发布帖子。 这是 SpaceX 官号首次通过星链来发送 X 帖子&a…

SpringBoot+Vue实战:打造企业级项目管理神器

✍✍计算机编程指导师 ⭐⭐个人介绍&#xff1a;自己非常喜欢研究技术问题&#xff01;专业做Java、Python、微信小程序、安卓、大数据、爬虫、Golang、大屏等实战项目。 ⛽⛽实战项目&#xff1a;有源码或者技术上的问题欢迎在评论区一起讨论交流&#xff01; ⚡⚡ Java实战 |…

【YOLO】INT8量化C++版

三、INT8量化 C++ 3.1下载coco128数据集 cd /mnt/workspace/yolov5/data/scripts sh get_coco128.sh3.2 模型准备 #onnx转simple_onnx pip install onnx-simplifier python -m onnxsim yolov5s.onnx yolov5s-simple.onnx3.3 下载量化代码库 git clone https://github.com/W…

水豚鼠标助手 强大的鼠标美化工具

水豚鼠标助手 水豚鼠标助手是一款 鼠标换肤、屏幕画笔、放大镜、聚光灯、屏幕放大、倒计时功能的强大屏幕演示工具。 软件助手获取 水豚鼠标助手1.0.0 安装教程 第一步&#xff1a;下载后&#xff0c;双击软件安装包 第二步&#xff1a;Windows可能会出现提示弹窗&#xff…

【已亲测有效】如何彻底删除nodejs,避免影响安装新版本

第一步开始菜单搜索uninstall node.js&#xff0c;点击之后等待删除&#xff08;删除node_modules文件夹以及以下这些文件&#xff09; 第二步手动删除nodejs下载位置的其他文件夹。&#xff08;就是另外自己新建的两个文件夹node_cache和node_global&#xff09; 到这里其实应…

uniapp实现多行文本溢出超过指定行数 展开 收起

一、组件封装 <template><view class"multiline"><view class"info"><view :class"{hide:!iSinfo}" :style"!iSinfo?computedStyle:"><view :style"{ color: textColor,fontWeight:fontWeight,font…

网络安全课程VIP介绍(比同行便宜)

免责声明 本文发布的工具和脚本&#xff0c;仅用作测试和学习研究&#xff0c;禁止用于商业用途&#xff0c;不能保证其合法性&#xff0c;准确性&#xff0c;完整性和有效性&#xff0c;请根据情况自行判断。如果任何单位或个人认为该项目的脚本可能涉嫌侵犯其权利&#xff0c…