5.1 创建和销毁线程

news2024/11/16 1:27:29

方法

pthread_create(thread, attr, start_routine, arg)

pthread_exit(status)

pthread_cancel(thread)

pthread_attr_init(attr)

pthread_attr_destroy(attr)

创建线程

        最开始main()程序只有一个默认的线程,其他的线程需要由编程人员显式创建。pthread_create()可以用于创建一个线程,这个方法可以在代码中的任意地方调用任意次数。

        pthread_create()的参数如下:

  • thread:一个不透明的,唯一的标识符,用于指向该函数创建的线程
  • attr:用于设置线程属性的对象,也可以设为NULL,此时线程的属性将使用默认值
  • start_routine:线程创建后将会执行的函数方法
  • arg:传给start_rountine的参数,其类型必须为void*,如果没有参数传入可设为NULL

线程数限制

        下面的例子展示了如何在Linux中获取和设置有关线程数限制的信息,首先我们获取了当前默认的设置,然后将进程的最大数量(包含线程)设为最大值,最后我们验证了修改生效。

bash / ksh / sh example

$ ulimit -a
core file size          (blocks, -c) 16
data seg size           (kbytes, -d) unlimited
scheduling priority             (-e) 0
file size               (blocks, -f) unlimited
pending signals                 (-i) 255956
max locked memory       (kbytes, -l) 64
max memory size         (kbytes, -m) unlimited
open files                      (-n) 1024
pipe size            (512 bytes, -p) 8
POSIX message queues     (bytes, -q) 819200
real-time priority              (-r) 0
stack size              (kbytes, -s) unlimited
cpu time               (seconds, -t) unlimited
max user processes              (-u) 1024
virtual memory          (kbytes, -v) unlimited
file locks                      (-x) unlimited

$ ulimit -Hu
7168

$ ulimit -u 7168

$ ulimit -a
core file size          (blocks, -c) 16
data seg size           (kbytes, -d) unlimited
scheduling priority             (-e) 0
file size               (blocks, -f) unlimited
pending signals                 (-i) 255956
max locked memory       (kbytes, -l) 64
max memory size         (kbytes, -m) unlimited
open files                      (-n) 1024
pipe size            (512 bytes, -p) 8
POSIX message queues     (bytes, -q) 819200
real-time priority              (-r) 0
stack size              (kbytes, -s) unlimited
cpu time               (seconds, -t) unlimited
max user processes              (-u) 7168
virtual memory          (kbytes, -v) unlimited
file locks                      (-x) unlimited

tcsh/csh example

% limit
cputime      unlimited
filesize     unlimited
datasize     unlimited
stacksize    unlimited
coredumpsize 16 kbytes
memoryuse    unlimited
vmemoryuse   unlimited
descriptors  1024
memorylocked 64 kbytes
maxproc      1024

% limit maxproc unlimited

% limit
cputime      unlimited
filesize     unlimited
datasize     unlimited
stacksize    unlimited
coredumpsize 16 kbytes
memoryuse    unlimited
vmemoryuse   unlimited
descriptors  1024
memorylocked 64 kbytes
maxproc      7168

        创建的线程之间是平等的,线程可以创建其他的线程,但是它们之间不存在继承或者依赖关系,如下图所示。

线程属性

        线程在创建时其属性会置为默认值,一些属性可以通过线程属性对象来进行设置。pthread_attr_init()和pthread_attr_destroy()用于初始化/销毁线程属性对象,还有一些方法用于获取/设置线程属性对象的信息,这些属性包括:

  • 分离/连接状态
  • 调度继承
  • 调度策略
  • 调度参数
  • 调度竞争范围
  • 栈大小
  • 栈地址
  • 栈保护(溢出)大小

        其中的一些属性会在后续内容讨论。

线程绑定和调度

        问题:创建线程后,编程人员如何知道1)什么时候系统调起该线程;2)线程会运行在哪个核上

        回答:Pthreads API提供了一些可用于设置线程调度相关的方法。譬如线程可设为使用先进先出策略、轮询策略、或者操作系统确定的策略进行调度。同时也可以设置线程的调度优先级。

        这些内容不在这里进行阐述,Linux中有关调度策略的一些信息可参阅sched_setscheduler

        Pthreads API中没有提供将线程绑定至某个核的方法,不过一些扩展方法可能实现了该功能——譬如pthread_setaffinity_np方法,这里的np表示non-portable,即不是通用的标准实现。

        当然一些操作系统也会提供相关的实现,譬如Linux中的sched_setaffinity方法。

线程结束

        线程有如下几种结束的方式:

  • 线程做完了工作后执行return
  • 线程在某个分支中调用了pthread_exit(),此时它的工作可能没有结束
  • 其他任务调用了pthread_cancel()来结束了该线程
  • 整个进程由于调用了exec()或者exit()而终止
  • 主线程结束了

        在pthread_exit()方法中编程人员可以传入一个可选的有关终止状态的参数,这个参数会传递给连接了被终止线程的其他线程(后续章节内容中阐述)。

        在能够正常完成执行的分支中一般不必调用pthread_exit(),除非你想要获取并使用任务的返回值。

        注意:pthread_exit()不会帮你关闭之前打开了的文件,任何在线程中打开的文件在线程终止后仍然会保持打开状态。

        在main()中调用pthread_exit()时需要注意:

  • 如果在main()中没有显式调用pthread_exit(),可能会出现主线程比它创建的线程更早结束的情况,此时所有的线程都会被强制结束,从而产生一些超出预期的情况。
  • 在main()中最后一步显式调用pthread_exit()时,将会阻塞住主线程,直到所有子线程完成任务。

例程:线程的创建和终止

        这个简单的例子中主函数调用pthread_create()创建了5个子线程,每个线程都会打印一句“Hello World!”。之后通过调用pthread_exit()结束线程。

#include <pthread.h>
#include <stdio.h>
#define NUM_THREADS     5

void *PrintHello(void *threadid)
{
   long tid;
   tid = (long)threadid;
   printf("Hello World! It's me, thread #%ld!\n", tid);
   pthread_exit(NULL);
}

int main (int argc, char *argv[])
{
   pthread_t threads[NUM_THREADS];
   int rc;
   long t;
   for(t = 0; t < NUM_THREADS; t++) {
      printf("In main: creating thread %ld\n", t);
      rc = pthread_create(&threads[t], NULL, PrintHello, (void *)t);
      if (rc) {
         printf("ERROR; return code from pthread_create() is %d\n", rc);
         exit(-1);
      }
   }

   /* Last thing that main() should do */
   pthread_exit(NULL);
}

        代码输出如下

In main: creating thread 0
In main: creating thread 1
Hello World! It's me, thread #0!
In main: creating thread 2
Hello World! It's me, thread #1!
Hello World! It's me, thread #2!
In main: creating thread 3
In main: creating thread 4
Hello World! It's me, thread #3!
Hello World! It's me, thread #4!

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

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

相关文章

【算能】stream在docker的环境下编译报错

错误问题一&#xff1a; /workspace/sophon-stream/element/multimedia/encode/../../../3rdparty/websocketpp/websocketpp/common/asio.hpp:56:14: fatal error: boost/version.hpp: No such file or directory 56 | #include <boost/version.hpp> 解决方法&a…

三门问题 最通俗解释+拓展

三门问题是概率论比较经典的一个问题&#xff0c;答案有点反直觉&#xff0c;所以值得学习&#xff0c;理性第一&#xff01;但是&#xff0c;很多网上解释都让人云里雾里&#xff0c;或者干脆解释就是错了&#xff0c;或一上来就贝叶斯公式开始搞数学&#xff0c;其实很简单可…

uniapp循环列表单选框实现单选

目录 图片源码参考最后 图片 源码 参考 大佬 最后 感觉文章好的话记得点个心心和关注和收藏&#xff0c;有错的地方麻烦指正一下&#xff0c;如果需要转载,请标明出处&#xff0c;多谢&#xff01;&#xff01;&#xff01;

PP-MobileSeg: 探索移动设备上又快又准的语义分割模型

论文&#xff1a;https://arxiv.org/abs/2304.05152 代码&#xff1a;https://github.com/open-mmlab/mmsegmentation/tree/main/projects/pp_mobileseg 0、摘要 transformer在CV领域的成功之后&#xff0c;出现了很多在移动设备上使用它们的尝试性工作&#xff0c;但是这些工作…

AI绘画 | stable-diffusion-web-ui的基本操作

前言 我们下载安装完成stable-diffusion-web-ui以后&#xff0c;下载对应风格的模型&#xff0c;就可以开始我们的绘画操作了。进行Ai绘画操作前&#xff0c;我们最好先弄清楚web ui界面上的参数按钮的含义。这样我们就能更轻松的绘画出我们想要stable-diffusion-web-ui创作出…

【蓝桥杯选拔赛真题08】C++最大值最小值平均值 青少年组蓝桥杯C++选拔赛真题 STEMA比赛真题解析

目录 C/C++最大值最小值平均值 一、题目要求 1、编程实现 2、输入输出 二、算法分析</

7个UI设计必备课程,小白必看!

无论你是想提高技能的资深UI设计师还是网站开发人员&#xff0c;又或者是刚转行不久的UI设计新手&#xff0c;学习UI设计课程都会让你做出更美观、更有影响力的UI界面设计作品。现在网上有很多网上的UI设计课程。通过这些课程&#xff0c;你可以自己学习、掌握一些UI设计的基础…

内网渗透-域防火墙+入站出站规则+组策略对象同步+不出网隧道上线

一.单机-防火墙-限制端口出入站-熟悉常见主机配置不出网的方式 配置防火墙属性 1.win10虚拟机本地搭建一个网站&#xff0c;配置防火墙属性的入站连接为默认值。 局域网中另一台主机能正常访问 2.入站连接设置为 阻止所有连接 。 因为是我们去访问他的网站&#xff0c;所以是入…

利用HTML和CSS3新特性实现太极图旋转

<!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>太极图</title><style>.box{box-sizing: border-box;width: 400px;height: 400px;margin: 50px auto;border: 1px solid black;position: …

EtherNET/IP转Mpdbus Tcp协议网关协议

JM-EIP-TCP 是一款 ETHERNET/IP 从站功能的通讯网关。该产品主要功能是将各种 MODBUS-TCP 设备接入到 ETHERNET/IP 网络中。 本网关连接到 ETHERNET/IP 总线中做为从站使用&#xff0c;连接到 MODBUS-TCP 总线中做为主站&#xff08;客户端&#xff09;或从站&#xff08;服务…

Poshmark 如何刺激流量?如何快速出单?

PoshMark可是美国市场上最大的二手交易平台&#xff0c;基本上啥都有&#xff0c;电商界的“菜市场”啊&#xff01;而且还有社交功能&#xff0c;好玩儿又实用&#xff0c;你可以和好友分享喜欢的商品&#xff0c;还能知道你的好友在买啥&#xff01;可是新手卖家会觉得怎么才…

概念解析 | 微波光子雷达:打通雷达性能增强的“光通道“

微波光子雷达:打通雷达性能增强的"光通道" 注1:本文系“概念解析”系列之一,致力于简洁清晰地解释、辨析复杂而专业的概念。本次辨析的概念是:微波光子雷达。 一、背景介绍 雷达是现代战争中极为重要的军事装备,被誉为各兵种的“眼睛”。它可以在全天候条件下发现和…

el-table表格设置——动态修改表头

(1) 首先是form表单写表单设置按钮&#xff1a; &#xff08;1.1&#xff09;使用el-popover&#xff0c;你需要修改的是this.colOptions&#xff0c;colSelect: <el-popover id"popover" popper-class"planProver" placement"bottom" width&…

部署WeBASE

1、检查环境 1.1、检查Java java -version 1.2、检查mysql mysql --version 1.3、检查Python python --version # python3时 python3 --version 2、修改配置 修改common.properties 修改webase-node-mgr 修改webase-node-mgr/conf/application.yml 修改webase-node-mgr…

还在用Excel处理进销存?不妨试试这款进销存管理!

现在还有人使用Excel表格做进销存管理吗&#xff1f; Excel表格过于复杂&#xff0c;要求比较高&#xff0c;想问问有没有更简单的方法搭建进销存系统&#xff0c;因此这篇就分享一个不需要Excel&#xff0c;也能做出一套完整的进销存管理系统的方法。 这是我在简道云用了十几…

AI时代新宠,向量数据库

随着生成式人工智能&#xff08;GAI&#xff09;应用以及大语言模型&#xff08;LLM&#xff09;的快速发展&#xff0c;一种新型数据库也获得了市场和资本的重点关注&#xff0c;它就是向量数据库&#xff08;Vector Database&#xff09;。 向量数据库简介 向量数据库是一种…

点击跳到详情页

父页面 <template><view class"order-list"><cu-custom bgColor"bg-gradual-blue" :isBack"true"><block slot"content">荒料管理</block></cu-custom><view class"" ><!-- 订…

【Python Numpy教程】切片和索引

文章目录 前言一、切片和索引是什么&#xff1f;二、数组索引操作示例代码12.3 示例代码22.4 示例代码3 三、数组切片3.1 最基础的数组切片1. 切片格式&#xff1a;2. 如何使用&#xff1a;3. 示例代码&#xff1a; 3.2 切片中包括省略号基本格式1. 单个省略号示例&#xff1a;…

Linux系统编程:IO系统总结

stdio标准IO 标准IO都是一些C语言的函数&#xff0c;注意与文件IO的系统调用函数区别开。 fopen 函数描述&#xff1a; 第一个参数填要打开的文件路径&#xff0c;第二个参数填以什么形式打开&#xff08;读or写or其它&#xff09;。 在我们学习fopen函数时&#xff0c;查看…

Vue基础之购物车案例

个人名片&#xff1a; &#x1f60a;作者简介&#xff1a;一名大二在校生 &#x1f921; 个人主页&#xff1a;坠入暮云间x &#x1f43c;座右铭&#xff1a;懒惰受到的惩罚不仅仅是自己的失败&#xff0c;还有别人的成功。 &#x1f385;**学习目标: 坚持每一次的学习打卡 经过…