linux---线程控制


线程和进程

以前我们要同时跑多个程序,可以通过fork()多个子进程,然后通过系统函数进行程序的替换,但是创建进程代价大,不仅要拷贝一份父进程的地址空间,页表,文件表述符表等。但是线程不需要因为是进程的执行流,共享同个地址空间,页表,只需让不同线程执行不同的代码块(函数就可以了)。

一、线程函数接口

它们的返回值都比较统一,成功就返回0,失败就返回错误码

(1)线程创建

第一个参数类型是我们在定义的一个pthread_t类型的变量指针,通过它我们可以拿到 用户识别的线程id。第二个参数设置为空。第三个参数是函数指针,第四个是我们要传入线程执行函数的参数,由于它的类型是void*,我们可以传入任意类型

(2)线程等待 

线程和进程一样,虽然是一个进程的地址空间的执行流,但是也要进行等待回收,不然会造成类似内存泄漏 问题。retval是输出型参数,通过它可以拿到线程退出信息(简单说就是线程执行函数的返回值)。

(3)线程中止

 进程有退出码,线程没有,只有我们自己写的返回值,既用pthread_exit()返回,或者直接return返回自定义的码(由于返回值类型是void*,要强转),不建议用exit()因为会造成主线程退出,主线程退出了,进程资源就释放了,所有线程就跟着退出了。通常这返回值信息会被线程等待函数pthread_join()拿到。


(4)线程分离 

 以前子进程退出如果父进程不进行等待,我们可以自定义捕捉函数对子进程发出的退出信号进行忽略,不会有僵尸进程。线程也可以通过分离,让主线程不用主动对它进行等待,就算线程退出也不会有类型内存泄漏问题。注意的是,线程分离只是一种工作状态,它和没分离的线程几乎一样,只是不用等待了。

二,多线程的创建

pthread_create函数参数由于是void*,我们就可以传任意类型的对象

makefile

test:classpthreads.cc
	g++ -o  $@ $^ -std=c++11 -lpthread 
.PHONY:clean
clean:
	rm -f test

 classpthreads.cc

#include<iostream>
using namespace std;
#include<pthread.h>
#include<unistd.h>
#include<string.h>
#include <sys/types.h>
#include<vector>

namespace ljh{
class Task{
public:
Task():datex(0),datey(0)
{
    
}
void SetDate(int x,int y)
{
    datex=x;
    datey=y;
}
int Excute()
{
    return datex+datey;
}
~Task()
{}
 
 private:
  int datex;
  int datey;

};
class threaddate:public Task
{
public:
    threaddate(int x,int y,char* threadname )
    :_x(x),_y(y),_threadname(threadname)
    {
       s.SetDate(_x,_y);
    }
    string getname(){

     return _threadname;

    }
    int run()
    {
   s.Excute();
    }

private:
string _threadname;
int _x;
int _y;
Task s;

};
class Result{
public:
void SetResult(int result,string& threadname)
{
   _result=result;
   _threadname=threadname;

}
void Print()
{

cout<<"result:"<<_result<<"threadname"<<_threadname<<endl;

}
private:
   int _result;
   string _threadname;
};


}

using namespace ljh;
void* handlerTask(void*p)
{
    
threaddate* td=static_cast<threaddate*>(p);
string name=td->getname();
Result* result=new Result();
int ret=td->run();
result->SetResult(ret,name);
delete td;
sleep(2);
return result;
    
}

vector<Result*>  ret;
vector<pthread_t> pthreadname;
int main()
{

 for(int i=0;i<5;i++)//创建5个线程
 {
     char* name=new char[64];
     pthread_t id;
     snprintf(name,sizeof(name),"Thread_%d",i+1);
     
      threaddate* p=new threaddate(2,6,name);
     pthread_create(&id,nullptr,handlerTask,p);
     pthreadname.push_back(id);
 }

 for(auto e:pthreadname)
 {  
   void* s=nullptr;//返回值,void*
     pthread_join(e,&s);//线程等待回收
     ret.push_back((Result*)s);
 }
 
    return 0;
}

三.创建的线程和主线程之间关系

1.多线程只是主线程的执行流,主线程main退出,子进程也会退出,所以我们必须让主线程最后退出

2.创建的新线程和主线程,哪个先运行,这个取决与调度器。

线程共享和私有

(1)共享:代码和全局数据和进程文件描述符表

因为它们拥有同一块地址空间

(2)私有:线程的硬件上下文数据(cpu寄存器的值),线程的独立栈结构。对于多进程来说,线程的上下文数据比进程少,所以也叫线程为轻量级进程。

我们可以用命令查看(ps -aL | grep  xxx).对于栈来说,不同线程可以分为进程地址空间的栈空间还有线程独立的栈,访问全局数据就时访问进程地址空间主栈,在线程执行函数里面变量之类的就是线程独立的栈。

验证:创建3个线程,定义一个全局变量vale,还有线程执行函数的n,不同的线程打印全局vale地址是相同,n的地址却是不同的。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

frp搭建内网流量转发

前提条件 有一台外网服务器 背景介绍 外网服务器linux内网客户端Windows 10下载frp软件安装包 下载地址:https://github.com/fatedier/frp/releases 服务端软件包下载 客户端软件包下载 服务端部署 解压软件包 tar xzvf frp_0.58.0_linux_amd64.tar.gz修复加压后文件夹名…

TemperMonkey在百度搜索页面,提供跳转其他平台搜索、与批量打开搜索结果的功能的脚本代码

代码 // UserScript // name 百度搜索。链接其他搜索。跳转功能。 // namespace http://tampermonkey.net/ // version 0.1(2020-6-24 17:37:27) // description try to take over the world! // author gwd // match https://www.baidu.com/s?…

深度学习中的优化算法一(Pytorch 18)

一 优化和深度学习 优化算法 使我们能够 继续更新模型参数&#xff0c; 并使损失函数的值最小化。这就像在训练集上评估一样。事实上&#xff0c;任何满足于将优化视为黑盒装置&#xff0c;以在简 单的设置中最小化目标函数的人&#xff0c;都可能会知道存在着一系列此类“咒…

Vivado报错集合

Synth 8-5535 报错代码 [Synth 8-5535] port <clk_0> has illegal connections. It is illegal to have a port connected to an input buffer and other components. The following are the port connections : Input Buffer:Port I of instance clkin1_ibufg(IBUF) i…

监控服务器性能指标,提升服务器性能

服务器是网络中最关键的组件之一&#xff0c;混合网络架构中的每个关键活动都以某种方式与服务器操作相关&#xff0c;服务器不仅是现代计算操作的支柱&#xff0c;也是网络通信的关键。 从发送电子邮件到访问数据库和托管应用程序&#xff0c;服务器的可靠性和性能直接影响到…

打开服务器远程桌面连接不上,可能的原因及相应的解决策略

在解决远程桌面连接不上服务器的问题时&#xff0c;我们首先需要从专业的角度对可能的原因进行深入分析&#xff0c;并据此提出针对性的解决方案。以下是一些可能的原因及相应的解决策略&#xff1a; 一、网络连接问题 远程桌面连接需要稳定的网络支持&#xff0c;如果网络连接…

【车载开发系列】Autosar中的VFB

【车载开发系列】Autosar中的VFB # 【车载开发系列】Autosar中的VFB 【车载开发系列】Autosar中的VFB一. 什么是VFB二. VFB的优点与缺点1&#xff09;VFB的缺点2&#xff09;VFB的好处 三. RTE与VFB之间关系四. 总线架构模式 一. 什么是VFB Virtual Functional Bus。它就是虚拟…

对话:用言语构建深刻的思想碰撞

对话&#xff1a;用言语构建深刻的思想碰撞 在写书中&#xff0c;对话是一种有力的工具&#xff0c;能与读者进行有效的沟通和交流&#xff0c;引发深思和反思。它不仅是信息传递的方式&#xff0c;更是加深情感、探讨主题和吸引读者参与的桥梁。你应从读者的角度思考&#xf…

labelme的使用

创建虚拟环境 听说是要用这个3.6版本的python环境 conda create --namelabelme python3.6激活虚拟环境 activate labelme下载labelme pip install labelme #安装labelme组件启动labelme 在你打开文件的时候推荐还是自己先建立一个label.txt 把自己要分的类别放进去 label.…

AI | 基于扣子 Coze 零代码手把手从 0-1 搭建专属 Bot 机器人

前言 无论是智能语音助手、聊天机器人&#xff0c;还是自动化流程机器人&#xff0c;它们都在为我们提供更加便捷、高效的服务。然而&#xff0c;对于非专业人士来说&#xff0c;搭建一个属于自己的机器人似乎是一项遥不可及的任务。基于扣子 Coze 零代码平台&#xff0c;我们…

【评价类模型】层次分析法(AHP)

1.评价类思想综述&#xff1a; 明确评价主体–>评价指标确定–>计算指标权重–>方案评价 1.1指标确定&#xff1a; 可以通过一个思维导图的方式来画出一个指标系统&#xff0c;先确定方向&#xff0c;再向下细化 注意&#xff1a;指标需要具有贴合性和独立性。 贴合…

【Python】【Scrapy 爬虫】理解HTML和XPath

为了从网页中抽取信息&#xff0c;必须对其结构有更多了解。我们快速浏览HTML、HTML的树状表示&#xff0c;以及在网页上选取信息的一种方式XPath。 HTML、DOM树表示以及XPath 互联网是如何工作的&#xff1f; 当两台电脑需要通信的时候&#xff0c;你必须要连接他们&#xff…

盖雅技能发展云,助力制造企业人效合一

制造行业尽管经历多次变革&#xff0c;但企业对人的管理始终是一项高度依赖经验和耗费人力的工作。随着供应链管理和生产设备的自动化、数字化升级&#xff0c;如何将第一生产要素——人&#xff0c;通过数字化的工具融入制造过程的闭环&#xff0c;对企业实现自动化工厂和智能…

C语言 | Leetcode C语言题解之第101题对称二叉树

题目&#xff1a; 题解&#xff1a; /*** Definition for a binary tree node.* struct TreeNode {* int val;* struct TreeNode *left;* struct TreeNode *right;* };*/ bool isSymmetric(struct TreeNode* root) {if (root NULL) return true;//如果根为空直接…

Python函数、类和方法

大家好&#xff0c;当涉及到编写可维护、可扩展且易于测试的代码时&#xff0c;Python提供了一些强大的工具和概念&#xff0c;其中包括函数、类和方法。这些是Python编程中的核心要素&#xff0c;可以帮助我们构建高效的测试框架和可靠的测试用例。 本文将探讨Python中的函数、…

Nginx的集群负载均衡(nginx构建tomcat集群案例)

一 .Nginx的集群负载均衡 1.nginx 集群负载均衡示意图 2.四层负载均衡和7层负载均衡 LVS 四层负载均衡(常用); Haproxy四层负载均衡;Nginx 四层负载均衡; Haproxy七层负载均衡;Nginx 七层负载均衡(常用); 3.nginx构建tomcat集群 步骤1:安装tomcat 步骤2:nginx配置tom…

【QT八股文】系列之篇章3 | QT的多线程以及QThread与QObject

【QT八股文】系列之篇章3 | QT的多线程 前言4. 多线程为什么需要使用线程池线程池的基础知识python中创建线程池的方法使用threading库队列Queue来实现线程池使用threadpool模块&#xff0c;这是个python的第三方模块&#xff0c;支持python2和python3 QThread的定义QT多线程知…

JeeSite V5.7.1:前后端技术革新与性能优化

一、引言 随着技术的快速发展&#xff0c;企业对快速开发平台的需求日益增加。JeeSite作为一款基于Java的快速开发平台&#xff0c;凭借其强大的功能和灵活的配置&#xff0c;已经获得了广泛的应用。近期&#xff0c;JeeSite发布了V5.7.1版本&#xff0c;该版本在前后端技术上…

世界最高的自动化立体库之一:贯通6层楼

导语 大家好&#xff0c;我是社长&#xff0c;老K。专注分享智能制造和智能仓储物流等内容。 新书《智能物流系统构成与技术实践》 自动化立体库的建设步骤主要包括以下几个方面&#xff1a; 收集需求&#xff1a;首先&#xff0c;与使用者、管理者或业主进行沟通&#xff0c;了…

【启明智显技术分享】SOM2D02-2GW核心板适配ALSA(适用Sigmastar ssd201/202D)

提示&#xff1a;作为Espressif&#xff08;乐鑫科技&#xff09;大中华区合作伙伴及sigmastar&#xff08;厦门星宸&#xff09;VAD合作伙伴&#xff0c;我们不仅用心整理了你在开发过程中可能会遇到的问题以及快速上手的简明教程供开发小伙伴参考。同时也用心整理了乐鑫及星宸…