linux---线程控制

news2024/10/6 20:03:06


线程和进程

以前我们要同时跑多个程序,可以通过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的地址却是不同的。

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

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

相关文章

使用JavaScript日历小部件和DHTMLX Gantt的应用场景(三)

DHTMLX Suite UI 组件库允许您更快地构建跨平台、跨浏览器 Web 和移动应用程序。它包括一组丰富的即用式 HTML5 组件&#xff0c;这些组件可以轻松组合到单个应用程序界面中。 DHTMLX Gantt是用于跨浏览器和跨平台应用程序的功能齐全的Gantt图表&#xff0c;可满足项目管理应用…

【调试笔记-20240520-Linux-在 WSL2 / Ubuntu 20.04 中编译 QEMU 可运行的 OVMF 固件】

调试笔记-系列文章目录 调试笔记-20240520-Linux-在 WSL2 / Ubuntu 20.04 中编译 QEMU 可运行的 OVMF 固件 文章目录 调试笔记-系列文章目录调试笔记-20240520-Linux-在 WSL2 / Ubuntu 20.04 中编译 QEMU 可运行的 OVMF 固件 前言一、调试环境操作系统&#xff1a;Windows 10 …

作业-day-240523

思维导图 知识点问答 1、IO多路复用的原理 1、创建一个检测文件描述符的容器 fd_set fds; 2、将需要检测的文件描述符放入容器中 FD_SET(文件描述符&#xff0c;&fds); 3、通过一个阻塞函数阻塞等待容器中是否有事件产生&#xff0c;如果有一个或多个事件产生&#xff0c…

C++设计模式|结构型 适配器模式

1.什么是适配器模式&#xff1f; 可以将⼀个类的接⼝转换成客户希望的另⼀个接⼝&#xff0c;主要⽬的是 充当两个不同接⼝之间的桥梁&#xff0c;使得原本接⼝不兼容的类能够⼀起⼯作。 2. 适配器模式的组成 &#xff08;1&#xff09;接口类&#xff0c;给客户端调用&…

软件设计师-上午题-计算题汇总

一、存储系统 - 存储容量计算&#xff08;字节编址、位编址、芯片个数&#xff09; 内存地址是16进制 内存地址编址的单位是Byte&#xff0c;1K1024B 1B 8 bit 1.计算存储单元个数 存储单元个数 末地址 - 首地址 1 eg. 按字节编址&#xff0c;地址从 A4000H 到 CBFFFH&…

汽车IVI中控开发入门及进阶(十八):显示技术之Frame Buffer帧缓冲器

Frame Buffer帧缓冲器(帧缓冲器,有时是帧存储器)是随机存取存储器(RAM)的一部分,包含驱动视频显示器的位图。它是一个内存缓冲区,包含表示完整视频帧中所有像素的数据。现代视频卡的核心包含帧缓冲电路。该电路将内存中的位图转换为可以在计算机监视器上显示的视频信号。…

Redis未授权访问漏洞复现 CNVD-2019-21763 CNVD-2015-07557

CNVD-2019-21763 漏洞描述 Redis是一个开源的使用ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库&#xff0c;并提供多种语言的API。 由于在Reids 4.x及以上版本中新增了模块功能&#xff0c;攻击者可通过外部拓展&#xff0c;在Redis中实现一个新…

redis集群不允许操作多个key解决方案、redis key负载均衡方案

前提 在cluster redis 中进行同一个命令处理不同的key会报错:CROSSSLOT Keys in request dont hash to the same slot,例如: 此示例使用sdiff 命令对pool_1与pool_2进行diff操作。 那么我们在业务场景中就需要将集群redis中的不同key进行操作,我们该如何处理呢? 本次的…

多线程(八)

一、wait和notify 等待 通知 机制 和join的用途类似,多个线程之间随机调度,引入 wait notify 就是为了能够从应用层面上,干预到多个不同线程代码的执行顺序.( 这里说的干预,不是影响系统的线程调度策略 内核里的线程调度,仍然是无序的. 相当于是在应用程序…

探秘QT 5软件开发:从零到实战的旅程

新书上架~&#x1f447;全国包邮奥~ python实用小工具开发教程http://pythontoolsteach.com/3 欢迎关注我&#x1f446;&#xff0c;收藏下次不迷路┗|&#xff40;O′|┛ 嗷~~ 目录 一、QT 5软件开发的启航 二、GUI框架比较与QT 5的选择 三、QT 5环境搭建与软件设计实战 四…

GPT-SoVITS语音克隆部署与使用

GPT-SoVITS是一款强大的少量样本语音转换与语音合成开源工具。当前&#xff0c;GPT-SoVITS实现了如下几个方面的功能&#xff1a; 由参考音频的情感、音色、语速控制合成音频的情感、音色、语速可以少量语音微调训练&#xff0c;也可不训练直接推理可以跨语种生成&#xff0c;…

Python魔法学院:PySpider篇——网络世界的探险与征服

Hi&#xff0c;我是阿佑&#xff0c;迎来到Python魔法学院&#xff0c;今天阿佑要带大家学习的是PySpider篇——一门让你在网络世界中探险与征服的魔法课程。从环境搭建到高级功能应用&#xff0c;再到性能优化&#xff0c;每一个章节都是成为数据大师的必经之路&#xff01; 文…

Ceph集群RBD块存储:快照与Copy-on-Write克隆的基本操作

文章目录 1.RBD块存储镜像克隆概念2.copy-on-write克隆的基本使用2.1.在块存储中创建一个快照2.2.将快照配置成保护模式2.3.基于快照克隆出镜像2.4.使用克隆的镜像2.5.查看一个快照下有哪些克隆的镜像 1.RBD块存储镜像克隆概念 镜像克隆官方文档&#xff1a;https://docs.ceph…

巨控无线通讯模块在煤化工皮带保护系统中的应用

一、项目介绍 近年来由于煤矿化工行业在实际生产过程中事故频发&#xff0c;国家安监部门自2022年起开展了为其三年的专项整治行动&#xff0c;皮带运输系统作为煤矿化工行业自动化系统的重要组成部分成为此次专项整治重点。 兖矿新疆能化有限公司作为山能集团在新疆分部的龙…

NoSQL Redis配置与优化

一、关系数据库与非关系型数据库 1. 关系型数据库&#xff1a; 关系型数据库是一个结构化的数据库&#xff0c;创建在关系模型&#xff08;二维表格模型&#xff09;基础上&#xff0c;一般面向于记录。 SQL 语句&#xff08;标准数据查询语言&#xff09;就是一种基于关系型…

Redis三主三从集群搭建(docker版)

文章目录 1.分布式存储算法1.哈希取余算法2.一致性哈希算法1.基本介绍2.优点1.容错性2.扩展性 3.缺点&#xff1a;数据倾斜问题 3.哈希槽分区&#xff08;大厂常用&#xff09; 2.基础环境搭建1.给六台机器都安装docker1.卸载旧版本的docker2.安装 gcc相关3.安装yum-utils软件包…

电脑连接爱快iKuai软路由之后,网卡没有正常获取到IP,无法访问爱快路由管理页?

前言 上一次咱们说到在爱快控制台上设置/辨认lan口&#xff0c;设置完成之后&#xff0c;其他的一些设置就需要在爱快iKuai软路由的管理页面上设置。 有些小伙伴会发现&#xff0c;当电脑连接上爱快软路由的lan口之后&#xff0c;电脑并没有正常获取到ip&#xff0c;导致无法访…

从零开始运行BERT的详细教程,使用MRPC数据集进行测试

1、安装anaconda环境 镜像网址:Index of /anaconda/archive/ | 清华大学开源软件镜像站 | Tsinghua Open Source Mirror 2、配置环境变量 3、创建虚拟环境 #常用命令 #创建 conda create -n xxx python3.8 #激活 conda activate xxx #删除 conda remove -n xxx --all #查看 con…

汀木云OZON选品工具,OZON跨境电商的选品利器

在竞争激烈的跨境电商市场中&#xff0c;选品是卖家们成功经营的关键之一。而汀木云OZON选品工具&#xff0c;作为OZON跨境电商的选品利器&#xff0c;以其独特的优势&#xff0c;为卖家们提供了精准、高效的选品解决方案。接下来看看汀木云OZON选品工具和萌啦OZON数据跨境OZON…

客户端Web资源缓存

为了提高Web服务器的性能,其中的一种可以提高Web服务器性能的方法就是采用缓存技术。 1.缓存 1.1.什么是缓存&#xff1f; 如果某个资源的计算耗时或耗资源&#xff0c;则执行一次并存储结果。当有人随后请求该资源时&#xff0c;返回存储的结果&#xff0c;而不是再次计算。…