高编:线程

一、pthread 线程
   

优点:

比多进程节省资源,可以共享变量。

 概念:

线程是轻量级进程,一般是一个进程中的多个任务。
进程是系统中最小的资源分配单位.
线程是系统中最小的执行单位

特征:

1、共享资源
2、效率高  30%
3、三方库: pthread  clone   posix
     3.1 编写代码头文件: pthread.h
     3.2 编译代码加载库: -lpthread   library 
            libpthread.so //库文件命名
            gcc 1.c -lpthread //编入库

缺点:

1、线程和进程相比,稳定性,稍微差些
2、线程的调试gdb,相对麻烦些
                              info thread 
                                       *1  
                                         2 
                                         3
                              thread 3 
        

线程与进程区别:

 1、资源:
        线程比进程多了共享资源。  IPC
        线程(8M)具有部分私有资源(各自的栈)
        进程(3G)只有私有资源没有共享资源
  2、 空间:
        进程空间独立,不能直接通信。
        线程可以共享空间,可以直接通信
 
3、进程---复杂问题
        线程---简单问题
 
4、线程属于某个进程

线程与进程共同处:

1、并发

二、线程的设计框架  posix

创建多线程 ==》线程空间操作 ===》线程资源回收
errno   strerror(errno)  perror();

1、创建多线程

2.1.1 pthread_create


    int pthread_create(pthread_t *thread, const pthread_attr_t *attr,
                                  void *(*start_routine) (void *), void *arg);
    功能:该函数可以创建指定的一个线程。
    参数:thread 线程id,需要实现定义并由该函数返回。
               attr   线程属性,一般是NULL,表示默认属性。
               start_routine 指向指针函数的函数指针。
                  本质上是一个函数的名称即可。称为
th                回调函数,是线程的执行空间。
{
}
          arg  回调函数的参数,即参数3的指针函数参数。
    返回值:成功 0
                  失败 非0错误码

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <pthread.h>
void *th1 (void*arg)
{while(1){printf("发送视频\n");sleep(1);}
}void *th2 (void*arg)
{while(1){printf("接受控制\n");sleep(1);}
}int main(int argc, char *argv[])
{pthread_t tid1,tid2;pthread_create(&tid1,NULL,th1,NULL);pthread_create(&tid1,NULL,th2,NULL);while(1);return 0;
}

2.1.2 注意:

一次pthread_create 执行只能创建 一个线程
每个进程 至少有一个线程 称为 主线程
主线程退出 则 所有创建的子线程都退出。 
主线程 必须有 子线程同时运行 才算 多线程程序
线程id 是线程的 唯一标识,是CPU维护的一组数字。
pstree 查看系统中 多线程的对应关系
多个子线程 可以 执行同一回调函数
ps -eLf 查看线程相关信息 Low Weigth Process
ps -eLo pid,ppid,lwp,stat,comm 

 2.1.3 pthread_self

pthread_t pthread_self(void); unsigned long int;  %lu (printf("%lu",pthread_self());)
   功能:获取当前线程的线程id
   参数:无
   返回值:成功 返回当前线程的线程id
                 失败  -1;
            syscall(SYS_gettid);
这个方法重启后失效
alias gcc='gcc -g -pthread '
unalias gcc 

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <pthread.h>
void *th1 (void*arg)
{while(1){printf("发送视频 %lu\n",pthread_self());sleep(1);}
}void *th2 (void*arg)
{while(1){printf("接受控制 %lu\n",pthread_self());sleep(1);}
}int main(int argc, char *argv[])
{pthread_t tid1,tid2;pthread_create(&tid1,NULL,th1,NULL);pthread_create(&tid2,NULL,th2,NULL);printf("main th %lu\n",pthread_self());while(1);return 0;
}

 2、线程的退出

2.2.1 pthread_exit

        自行退出 ==》自杀  ==》子线程自己退出
        exit(1);
        void pthread_exit(void *retval);  exit  return p;
        功能:子线程自行退出
        参数: retval 线程退出时候的返回状态,临死遗言。
        返回值:无

            th
            {
                int a =10;

                pthread_exit(&a);
            }
            join(,&ret)

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <pthread.h>
void *th1 (void*arg)
{int i =3;while(i--){printf("发送视频 %lu\n",pthread_self());sleep(1);}pthread_exit(NULL);//return NULL;
}void *th2 (void*arg)
{int i = 3;while(i--){printf("接受控制 %lu\n",pthread_self());sleep(1);}pthread_exit(NULL);
}int main(int argc, char *argv[])
{pthread_t tid1,tid2;pthread_create(&tid1,NULL,th1,NULL);pthread_create(&tid2,NULL,th2,NULL);printf("main th %lu\n",pthread_self());while(1);return 0;
}

 2.2.2 pthread_cancel

        强制退出 ==》他杀  ==》主线程结束子线程
        int pthread_cancel(pthread_t thread);
        功能:请求结束一个线程
        参数:thread 请求结束一个线程tid
        返回值:成功 0
                      失败 非0错误号; 

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <pthread.h>
void *th1 (void*arg)
{while(1){printf("发送视频\n");sleep(1);}
}void *th2 (void*arg)
{while(1){printf("接受控制\n");sleep(1);}
}int main(int argc, char *argv[])
{pthread_t tid1,tid2;pthread_create(&tid1,NULL,th1,NULL);pthread_create(&tid2,NULL,th2,NULL);int i = 0 ;while(1){i++;if(3 == i ){pthread_cancel(tid1);}if(5 ==i){pthread_cancel(tid2);}sleep(1);}return 0;
}

(时间可能不准确,大致3s关,5s关,线程同时走)每次结果可能都不一样 

3、线程的回收 

2.3.1 线程的回收机制

====》不同与进程没有孤儿线程和僵尸线程。
====》主线程结束任意生成的子线程都会结束。
====》子线程的结束不会影响主线程的运行。
    char * retval ; retval++; 1 
    int * retval; 

2.3.2 pthread_join

   int pthread_join(pthread_t thread, void **retval);    
  功能:通过该函数可以将指定的线程资源回收,该函数具有阻塞等待功能,如果指定的线程没有               结束,则回收线程会阻塞。(如果子线程没有回收成功,主线程不会执行后面的代码)
  参数:thread  要回收的子线程tid
             retval  要回收的子线程返回值/状态。==》ptread_exit(值);
  返回值:成功 0
                失败 非0错误号;


#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <pthread.h>
void *th1 (void*arg)
{int i = 3;while(i--){printf("发送视频\n");sleep(1);}
}void *th2 (void*arg)
{int i = 3;while(i--){printf("接受控制\n");sleep(1);}
}int main(int argc, char *argv[])
{pthread_t tid1,tid2;pthread_create(&tid1,NULL,th1,NULL);pthread_join(tid1,NULL);pthread_join(tid2,NULL);printf("子线程已被回收\n");return 0;
}

 join接收返回值

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <pthread.h>void* th(void* arg)
{static char buf[256]={0};strcpy(buf,"要消亡了\n");return buf;
}int main(int argc, char *argv[])
{pthread_t tid;void* ret;pthread_create(&tid,NULL,th,NULL);pthread_join(tid,&ret);printf("ret %s\n",(char*)ret);return 0;
}

 

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <pthread.h>void* th(void* arg)
{static int a =20;return &a;
}int main(int argc, char *argv[])
{pthread_t tid;void* ret;pthread_create(&tid,NULL,th,NULL);pthread_join(tid,&ret);printf("ret %d\n",*(int*)ret);return 0;
}

2.3.3 子线程的回收策略

  1)如果预估 子线程可以有限范围内结束 则 正常用pthread_join等待回收。
  2)如果预估 子线程可能休眠 或者 阻塞 则 等待一定时间后 强制回收。
  3)如果子线程已知 必须长时间运行 则 不再回收其资源。 

4、线程的参数,返回值

5、线程的清理(成对使用)

2.5.1 cleanup_push

void pthread_cleanup_push(void (*routine)(void *),void *arg);//相当于do while 中的 do

    功能:注册一个线程清理函数
    参数:routine,线程清理函数的入口
               arg,清理函数的参数
    返回值:无

 2.5.2 cleanup_pop

void pthread_cleanup_pop(int execute);//相当于do while 中的 while
    功能:调用清理函数
    参数: execute,非0  执行清理函数
                                   0  不执行清理   
    返回值:无

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <pthread.h>
#include <string.h>void clean(void* arg)
{printf("this is clean ,arg is %s\n",(char*)arg);free(arg);
}
void* th(void*arg)
{pthread_cleanup_push(clean,arg);printf("th arg is %s\n",(char*)arg);pthread_cleanup_pop(1);return NULL;
}int main(int argc, char *argv[])
{pthread_t tid;char* p = (char*)malloc(50);strcpy(p,"hello");pthread_create(&tid,NULL,th,p);pthread_join(tid,NULL);return 0;
}

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

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

相关文章

qt可点击的QLabel

需求——问题与思路 使用wpf实现一个可点击的超链接label相当简单&#xff08;如下图&#xff09;&#xff0c;但是qt的QLabel不会响应点击事件&#xff0c;那就从QLabel继承一个类&#xff0c;然后在该类中重写mousePressEvent函数&#xff0c;并在该函数中对左键点击事件做响…

应对SQL注入攻击:保障网站安全的策略

在互联网的广阔天地中&#xff0c;网站安全始终是站长用户和企业开发者不可忽视的重要议题。其中&#xff0c;SQL注入攻击作为一种常见的网络攻击手段&#xff0c;严重威胁着网站的数据安全和业务稳定。什么是SQL注入攻击&#xff0c;我们该如何应对这种攻击呢&#xff1f;今天…

成都欣丰洪泰文化传媒有限公司电商服务的新星力量

在当今这个数字化飞速发展的时代&#xff0c;电商行业如日中天&#xff0c;成为拉动经济增长的新引擎。在这股浪潮中&#xff0c;一家名为成都欣丰洪泰文化传媒有限公司的企业&#xff0c;凭借其专业的电商服务能力和创新的营销策略&#xff0c;成为了众多品牌背后的强大推手。…

怎么保护CAD图纸丨CAD图纸防泄密方法推荐

怎么保护CAD图纸丨CAD图纸防泄密方法推荐 在现代工程设计和建筑行业中&#xff0c;CAD图纸承载着项目的核心信息&#xff0c;是极其重要的知识产权。一旦CAD图纸被盗或泄露&#xff0c;不仅可能导致商业机密的丧失&#xff0c;还可能给公司带来重大经济损失&#xff0c;甚至面…

AI新功能发布:AI生成数据库和AI规划任务,CoCodeAI再添新成员!

Hi&#xff0c;大家好&#xff0c;好久不见&#xff01; 我是CoCodeAI智能助手CoCo。 CoCodeAI智能助手CoCo 我无比荣幸地为大家揭晓 CoCode开发云的璀璨新星&#xff1a; AI生成数据库AI规划任务。 近日&#xff0c;CoCode开发云旗下Co-Project V3.8智能项目管理平台重磅发…

MySQL数据库中文乱码处理

出现中文乱码之后处理方式 1、执行下面语句查看一下关于编码方式 show variables like %char%结果展示&#xff1a;【你应该和我的不一样】 2、如果你的和我查询结果不一致请设置成一致语句&#xff0c;根据自己需要复制语句 如下&#xff1a;【除了最后一条记录哈】 SET G…

2024 年江西省研究生数学建模竞赛A题:交通信号灯管理问题分析、实现代码及参考论文

2024 年江西省研究生数学建模竞赛题目交通信号灯管理 1 题目 交通信号灯是指挥车辆通行的重要标志&#xff0c;由红灯、绿灯、 黄灯组成。红灯停、绿灯行&#xff0c;而黄灯则起到警示作用。交通 信号灯分为机动车信号灯、非机动车信号灯、人行横道信号 灯、方向指示灯等。 一…

文件扫描件怎么弄?文件扫描就用这5个方法

在快节奏的现代生活中&#xff0c;我们经常需要处理大量纸质文件&#xff0c;因为它们不仅占用空间&#xff0c;还可能因时间的流逝而损坏或丢失。 幸运的是&#xff0c;有了文件扫描软件手机版&#xff0c;我们可以将这些文件轻松转换为PDF格式&#xff0c;既保留了原始布局&…

第五届计算机、大数据与人工智能国际会议(ICCBD+AI 2024)

随着科技的飞速发展&#xff0c;计算机、大数据和人工智能等前沿技术已成为推动社会进步的重要力量。为了加强这一领域的学术交流与合作&#xff0c;促进技术创新与发展&#xff0c;第五届计算机、大数据与人工智能国际会议&#xff08;ICCBDAI 2024&#xff09;将于2024年11月…

Unreal Engine@Jetson Orin Nano尚不支持

Unreal EngineJetson Orin Nano尚不支持 1. 源由2. Unreal Engine介绍3. 问题4. 编译方法5. 补充 1. 源由 最近在看SC-Explorer方面的内容&#xff0c;在模拟方面采用了Unreal Engine。 本打算跑下模拟&#xff0c;因此打算在JetsonOrin的板子上试试看。 2. Unreal Engine介绍…

5款简洁干净,功能强悍,专注实用的软件

​ 电脑上的各类软件有很多&#xff0c;除了那些常见的大众化软件&#xff0c;还有很多不为人知的小众软件&#xff0c;专注于实用功能&#xff0c;简洁干净、功能强悍。 1.音量控制利器——EarTrumpet ​ EarTrumpet是一款专为Windows用户设计的音量控制软件。它允许用户轻松…

`THREE.LineBasicMaterial` 是 three.js 中用来创建用于绘制线条的基本材质。

demo案例 THREE.LineBasicMaterial 是 three.js 中用来创建用于绘制线条的基本材质。以下是它的入参、出参、方法和属性的详细说明。 入参 (Constructor Parameters) THREE.LineBasicMaterial 构造函数可以接收一个包含多个属性的对象。常用属性如下&#xff1a; const ma…

第一后裔快速领取掉宝奖励礼包教程

7月2日第一后裔在steam正式上线&#xff0c;全新刷宝射击mmo玩法&#xff0c;角色的招式非常新颖 &#xff0c;画面冲击感十足&#xff0c;而且游戏人物的自定义功能非常丰富&#xff0c;超级细节真实的人物建模&#xff0c;加上超带感的服装自定义系统&#xff0c;让你能玩一整…

在CentOS7云服务器下搭建MySQL网络服务详细教程

目录 0.说明 1.卸载不要的环境 1.1查看当前环境存在的服务mysql或者mariadb 1.2卸载不要的环境 1.2.1先关闭相关的服务 1.2.2查询曾经下载的安装包 1.2.3卸载安装包 1.2.4检查是否卸载干净 2.配置MySQLyum源 2.1获取mysql关外yum源 2.2 查看当前系统结合系统配置yum…

优思学院|今时今日还有谁想干供应商质量工程师(SQE)?

引言&#xff1a;SQE的迷思 供应商质量工程师&#xff08;SQE&#xff09;这个职位&#xff0c;听起来颇具技术性和专业性&#xff0c;但在职场中&#xff0c;却常常被视为一个既有挑战又不容易受到欢迎的岗位。SQE究竟是一个怎样的角色&#xff1f;谁愿意选择这个职业&#x…

为什么127.0.0.1和localhost之间算跨域?

原文&#xff1a;https://mp.weixin.qq.com/s/4zJBMNEntwjqAfN6A6diUA 什么是同源策略、跨域 跨域问题是指在浏览器中&#xff0c;当一个网页向不同域名、不同端口或不同协议的资源发起请求时&#xff0c;会受到限制。这是由浏览器的**同源策略&#xff08;Same-Origin Policy…

uniapp实现可拖动悬浮按钮(最新版2024-7月)

此章主要介绍如何使用uniapp跨平台开发&#xff0c;实现悬浮按钮&#xff0c;移动端经常会有所这样的需求&#xff0c;那么功能如下&#xff1a; 1.圆圈悬浮球&#xff0c;上下左右靠边显示 2.可以界面任何拖动&#xff0c;不会超出界面 3.单击悬浮球的点击事件 效果&#xf…

Resilience4j之RateLimiter和常见限流算法总结

官网地址&#xff1a;https://resilience4j.readme.io/docs/ratelimiter 中文文档&#xff1a;https://resilience4j.readme.io/docs/ratelimiter 【1】概述 Resilience4j提供了一个限流器&#xff0c;它将从epoch开始的所有纳秒划分为多个周期。每个周期的持续时间RateLimi…

【opencv - C++ - Ubuntu】putText 显示中文最快方法

话不多说&#xff0c;直接上代码 #include <iostream> #include <opencv2/opencv.hpp> #include <opencv2/freetype.hpp>using namespace std; using namespace cv;int main(void) {Mat image(1000, 1800, CV_8UC3, Scalar(200,162,33));Ptr<freetype::F…

单细胞水平看生存分析相关基因

技能树学徒作业 针对每个癌症的全部基因批量了做了单基因的cox分析&#xff0c;挑选统计学显著的去对应的癌症去打分&#xff0c;看看是否有单细胞亚群特异性。 这题比较常规&#xff0c;但是可以过一遍基础分析的流程。 选择了GSE38832芯片数据用于分析得到cox/logrank显著…