线程控制+线程tid+线程局部存储+线程私有栈

news2024/9/30 21:23:28

线程控制函数

今天学习的都是linux线程库中的函数。<pthread.h>

pthread_creat()创建线程

int pthread_create(pthread_t *thread, const pthread_attr_t *attr,
     void *(*start_routine) (void *), void *arg);

参数

  1. thread:返回线程ID
  2. attr:设置线程的属性,attr为NULL表示使用默认属性(默认nullptr
  3. start_routine:是个函数地址,线程启动后要执行的函数
  4. arg:传给线程启动函数的参数

返回值

  • 成功返回0;失败返回错误码

pthread_exit()线程终止

void pthread_exit(void *value_ptr);

参数:

  • value_ptr:value_ptr不要指向一个局部变量。最好指向堆上空间

返回值:

  • 没有返回值谢谢。

这个函数类似于线程函数返回,可以说是等同于return。子进程退出正常退出不影响其他线程

但是主线程调用该函数的时候,与return有极大的区别。

 主线程return退出

 主线程pthread_exit退出

pthread_cancel()线程终止

int pthread_cancel(pthread_t thread)

参数:

  • thread:线程ID

返回值:

  • 成功返回0;失败返回错误码,成功也没必要返回。

和pthread_exit一样,子终止,主进程不影响,主进程终止,子进程不影响。

配合函数pthread_self()

pthread_t pthread_self(void);

无需传参,哪个线程调用就返回该线程id。

配合使用:pthread_cancel(pthread_self());//中止当前进程。

pthread_join()线程等待

int pthread_join(pthread_t thread, void **value_ptr);

参数:

  1. thread:线程ID value_ptr:
  2. 它指向一个指针,后者指向线程的返回值

返回值:成功返回0;失败返回错误码

就是线程结束的时候返回值可以用join的第二个参数保持。

void*function(void*ags)
{
  int cnt=0;
  int*data=new int[5];
  while(1)
  {
    sleep(1);
    data[cnt]=cnt;
    cout<<"new thread cnt:"<<cnt++<<endl;
    if(cnt==5)
    {
      break;
    }
  }
  return (void*)data;
}


int main()
{
  pthread_t tid;
  pthread_create(&tid,nullptr,function,nullptr);
  int*data=nullptr;
  pthread_join(tid,(void**)&data);
  for(int i=0;i<5;i++)
  { 
    cout<<data[i]<<' ';
  }
    //。。。。。。。。。
}

 主进程以阻塞的方式等待编号为tid的线程退出。可以以非阻塞的方式等待退出吗?不可以。

无视线程,对线程分离。

int pthread_detach();线程分离

int pthread_detach(pthread_t thread);

参数:

  • 想要分离的线程id

返回值:

  • 成功0,失败错误码

可以是线程组内其他线程对目标线程进行分离,也可以是线程自己分离:

pthread_detach(pthread_self());

joinable和分离是冲突的,一个线程不能既是joinable又是分离的。

void*function(void*ags)
{
  pthread_detach(pthread_self());
  sleep(1);
  return nullptr;
}

int main()
{
  pthread_t tid;
  pthread_t maintid=pthread_self();
  pthread_create(&tid,nullptr,function,(void*)maintid);
  sleep(2);
  int n=pthread_join(tid,nullptr);
  cout<<"n:"<<n<<" 错误信息"<<strerror(n)<<endl;
} 

分离的线程不可以被主线程等待,但是分离的线程也是整个进程的线程,一旦异常也会对整个进程造成影响。

pthread_kill()对线程发送信号

int pthread_kill(pthread_t thread, int sig);

参数:

  1. thread:接收信号的线程id
  2. 发送的信号

返回值:

  • 成功返回1,失败返回错误码。

与kill系统函数不同,如果用kill发送信号给同进程的其他线程,那么也只会自己接收到,而pthread_kill则是精准的发送给对应的线程。

对线程id理解

int main()
{
  pthread_t tid=pthread_self();
  printf("tid:%d  16进制tid:%p \n",tid,tid);
    //。。。。。。
}

看起来我们的tid好像一个地址信息。

其实tid就是地址信息,对应的线程其实是操作系统在进程的共享区开辟的一块空间,一份线程一份空间,我们的tid线程id其实是线程空间的起始地址。

对线程栈与局部存储理解

不同的线程在运行期间调用着不同的函数在系统中运行,但是栈区只有一个,每个线程的函数栈帧也不同,一个栈区无法满足多个线程同时运行,所以OS就在地址空间的共享区中,开辟了子线程的自己的栈区,而原先的栈区在多线程与单线程下都是给主线程来运行的。

 局部存储

线程也有着自己的局部存储空间,保存这一些私有的数据。

我们定义一个全局变量,然后子线程与主线程同时打印数据与地址,然后子线程修改全局变量,然后继续打印。

int g_val=0;
void*childfunction(void*ags)
{
  int cnt=0;
  while(1)
  {
    printf("child thread g_val:%d  &g_val:%p  cnt:%d\n",g_val,&g_val,++cnt);
    if(cnt==5)
    {
      printf("child change data\n");
      g_val=1;
    }
    sleep(1);
  }
  return nullptr;
}

int main()
{
  pthread_t tid;
  pthread_create(&tid,nullptr,childfunction,nullptr);
  while(1)
  {
    printf("main thread g_val:%d  &g_val:%p\n",g_val,&g_val);
    sleep(1);
  }
   //........
}

父子线程共享该全局变量,如果不想共享数据,可以在全局变量前加修饰符__thread。这个时候在编译的时候就会在子线程共享区中生成私有的全局变量。

__thread int g_val=0;

确实全局数据被不同的进程访问的是不一样的了。

但是观察发现,似乎主线程的全局数据地址也在共享区,的确主线程也有着自己的线程结构体。

 主线程也有对应的,线程数据结构。

 

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

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

相关文章

eclipse怎么导入web项目?看这篇为你解决!

引言【注意】 在导入别人写好或者自己写的web项目要确定以下几点&#xff0c;防止导入的时候出现错误。 确认eclipse的版本&#xff1b;如果web项目是21版的eclipse写的&#xff0c;而你要导入的的eclipse是17版的会出现错误&#xff0c;导入了也没用&#xff0c;运行不出结果。…

Huggingface使用

文章目录 前置安装Huggingface介绍NLP模块分类transformer流程模块使用详细讲解tokennizermodeldatasetsTrainer Huggingface使用网页直接体验API调用本地调用(pipline)本地调用&#xff08;非pipline&#xff09; 前置安装 anaconda安装 使用conda创建一个新环境并安装pytorc…

Qt应用开发(基础篇)——LCD数值类 QLCDNumber

一、前言 QLCDNumber类继承于QFrame&#xff0c;QFrame继承于QWidget&#xff0c;是Qt的一个基础小部件。 QLCDNumber用来显示一个带有类似lcd数字的数字&#xff0c;适用于信号灯、跑步机、体温计、时钟、电表、水表、血压计等仪器类产品的数值显示。 QLCDNumber可以显示十进制…

关于将预留单中增强字段带入物料凭证和会计凭证中

1、业务需求 预留中自定义文本字段“大项修”。根据预留创建物料凭证时&#xff0c;将该字段带入到物料凭证中&#xff0c;类似标准字段“项目文本”。并在物料凭证自动产生会计凭证后&#xff0c;将该字段带入到会计凭证行项目中。 其中需要解决以上三张凭证对该字段的界面显…

c/c++函数可变参数的实现

c语言&#xff0c;利用<stdarg.h> 里面的 typedef char* va_list; void va_start ( va_list ap, prev_param ); /* ANSI version */ type va_arg ( va_list ap, type ); void va_end ( va_list ap );#include <stdio.h> #include <stdarg.h> double Sum(int…

火爆全球的AI艺术二维码到底是怎么做的?

如今&#xff0c;二维码扫描已经成为一种与呼吸一样自然的本能动作。支付、购物、点餐、订票、浏览网页&#xff0c;几乎所有事情都可以通过扫描二维码来完成。你是否可以想象到下面是二维码&#xff1f;AI生成的艺术二维码使二维码瞬间变得高逼格。这些艺术二维码极具吸引力&a…

如何制定项目计划?甘特图告诉你

最近被领导指派负责一个新的项目&#xff0c;我想把项目做成功&#xff0c;给老板留下深刻的印象&#xff0c;同时也给自己的职业生涯添上浓墨重彩的一笔。 但是&#xff0c;项目管理流程很复杂&#xff0c;项目本身也不好做。在收集了与该项目有关的所有信息&#xff0c;并将…

亚马逊搜索关键词下单有哪些好处

在亚马逊上使用搜索关键词进行下单有许多好处&#xff0c;以下是其中一些主要的优点&#xff1a; 1、准确的产品匹配&#xff1a; 通过输入相关的搜索关键词&#xff0c;您可以更准确地找到您所需的产品&#xff0c;从而避免了浏览大量无关的商品页面。 2、节省时间&#xff…

亚马逊买家账号多久可以评论

根据亚马逊的政策&#xff0c;买家账号在购买商品后通常需要等待一段时间才能发布评论。 1、实物商品&#xff1a; 买家需要等待购买商品后的48小时&#xff0c;然后才能发布评论。 2、数字商品&#xff1a; 买家需要等待购买数字商品后的24小时&#xff0c;然后才能发布评论…

深度学习之用PyTorch实现逻辑回归

0.1 学习视频源于&#xff1a;b站&#xff1a;刘二大人《PyTorch深度学习实践》 0.2 本章内容为自主学习总结内容&#xff0c;若有错误欢迎指正&#xff01; 代码&#xff08;类比线性回归&#xff09;&#xff1a; # 调用库 import torch import torch.nn.functional as F#…

[保研/考研机试] KY187 二进制数 北京邮电大学复试上机题 C++实现

描述 大家都知道&#xff0c;数据在计算机里中存储是以二进制的形式存储的。 有一天&#xff0c;小明学了C语言之后&#xff0c;他想知道一个类型为unsigned int 类型的数字&#xff0c;存储在计算机中的二进制串是什么样子的。 你能帮帮小明吗&#xff1f;并且&#xff0c;小…

使用MyEclipse如何部署Descriptor (XML)编辑器?

Descriptor (XML) Editor编辑器包含了高级的XML编辑功能&#xff0c;在本文中您将了解到这些编辑功能、Web XML编辑等&#xff0c;此功能包含在MyEclipse中可用。 MyEclipse v2023.1.2离线版下载 1. Web XML 编辑器 MyEclipse Web XML编辑器包括高级XML编辑功能&#xff0c;…

2022年世界各国GDP总量、人均GDP总量及排名

【勘误&#xff1a;表格第103哥伦比亚应为柬埔寨】

线程隔离问题之服务降级、熔断

一、雪崩问题 微服务中&#xff0c;服务间调用关系错综复杂&#xff0c;一个请求&#xff0c;可能需要调用多个微服务接口才能实现&#xff0c;会形成非常复杂的调用链路&#xff1a; 如图&#xff0c;一次业务请求&#xff0c;需要调 用A、P、H、I四个服务&#xff0c;这四个…

【LeetCode每日一题】——575.分糖果

文章目录 一【题目类别】二【题目难度】三【题目编号】四【题目描述】五【题目示例】六【题目提示】七【解题思路】八【时间频度】九【代码实现】十【提交结果】 一【题目类别】 哈希表 二【题目难度】 简单 三【题目编号】 575.分糖果 四【题目描述】 Alice 有 n 枚糖&…

​三江学院图书馆藏八一新书《乡村振兴战略下传统村落文化旅游设计》

​三江学院图书馆藏八一新书《乡村振兴战略下传统村落文化旅游设计》

【转】彻底搞明白 GB2312、GBK 、GB18030和UTF-8

日常工作的过程中&#xff0c;关于字符编码的问题经常让人头疼不已&#xff0c;这篇文章就来捋一捋关于 GB2312、GBK、GB18030 相关的知识 以及它们和 Unicode 的关系 简介 GB2312&#xff08;2个字节&#xff09; 1980 年&#xff0c;中国发布了第一个汉字编码标准&#xf…

明道云联合Kyligence结合示范性场景应用

案例背景 前言 国内大部分制造企业在经历疫情后&#xff0c;终于迎来了市场端的消费需求的恢复和增长&#xff0c;但如何在激烈的竞争中以更少投入&#xff0c;获得更高回报&#xff0c;在市场上获得一席生存之地&#xff0c;成为了悬在众多企业头上的达摩克利斯之剑。在市场…

手搓 LLM (不用rnn 不用attention 完全新思路)padding 实验

数据集地址 诗 实验过的几种策略 主体代码 import paddle import numpy as np from tqdm import tqdm import pandas as pd class EmMask(paddle.nn.Layer):def

力扣63.不同路径II(动态规划)

/*** author Limg* date 2022/08/09* 一个机器人位于一个 m x n 网格的左上角 &#xff08;起始点在下图中标记为 “Start” &#xff09;。* 机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角&#xff08;在下图中标记为 “Finish”&#xff09;。* 现在考虑网…