IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 系统运维 -> Linux线程总结---线程的创建、退出、取消、回收、分离属性 -> 正文阅读

[系统运维]Linux线程总结---线程的创建、退出、取消、回收、分离属性

一、线程的基本概念

	1、基本概念
	线程是特殊的进程,在操作系统中,线程不能独立存在,线程是进程创建出来的,一个进程可以有多个线程,进程退出了,线程也会跟着退出。
	2、资源
	每个进程都有自己独立的堆、栈、数据段、代码段等空间,线程基本没有独立的资源,只有必不可少的资源(栈),同一进程之间的线程共享进程中的所有资源。

二、线程相关的API

1、线程创建函数
在这里插入图片描述
thread:存放线程的id
attr:线程的分离属性—>NULL
start_routine :参数为void *, 返回值也是void * 类型的函数指针。(线程执行函数)
arg:函数的参数
返回值:成功返回0,失败返回非0.
代码段:

void * Pthread_Task(void *arg)// arg = data;
{
	int a = (long)arg;
	printf("-----%d\n", a);
}
int main()
{
    long data = 110;
    //创建线程
	pthread_t pid;
	int ret = pthread_create(&pid, NULL, Pthread_Task, (void *)data);
	if(ret != 0)
	{
		perror("ptread_create");
		return -1;
	}
	else
	{
		printf("线程创建成功!\n");
	}
}

2、线程的退出
在这里插入图片描述
retal: 返回线程结束的状态(void*变量)
让线程退出的三种方法:

  • 线程的任务函数调用完返回退出(直接死),让其他人给这个死的线程回收线程资源.线程调用这个pthread_exit();
    立马死了,让其他人给这个死的线程回收线程资源.
  • 取消线程 pthreada_cancel:只是一个请求(不能保证线程肯定会去退出)
  • 设置线程位分离属性,他死了不需要别人给他收尸。
    3、线程资源回收函数
    在这里插入图片描述
    thread: 子线程的id
    retval: 子线程结束状态
    等待回收子线程的资源(栈空间),作用相当于子线程中的waitpid
    pthread_join:默认是堵塞的,自己不能调用pthread_join来回收自己。
    4、设置线程分离属性
    在这里插入图片描述
    1)分离属性:子线程的资源由系统回收,线程的资源回收需使用pthread_join来实现,如果该线程运行没有结束,会阻塞主线程,当主线程还要创建新线程来做一些事情,此时主线程就会因为调用pthread_join而被堵塞,就没办法处理其他事务,所以引入线程的分离属性,他不需要主线程回收,在退出系统会自动回收。
    线程分离函数:
    int pthread_detach(pthread_t thread);
    thread:线程id
    2)线程创建时选择分离属性-----对pthread_create的第二个参数进行设置
    pthread_attr_t *attr
    定义一个pthread_attr_t 类型变量attr,然后对这个变量attr 进行初始化 pthread_attr_init()最后设置分离属性。
    ① 初始化线程属性
    int pthread_attr_init(pthread_attr_t *attr);
    ② 设置分离属性
    int pthread_attr_setdetachstate(pthread_attr_t *attr, int detachstate);
    5、线程的取消
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    1)线程取消函数:pthread_cancel()
    2)设置线程取消响应—>是否响应取消信号
    3)设置响应取消信号的类型---->立即响应、延时响应
    代码段:
#include <stdio.h>
#include <errno.h>
#include <pthread.h>
#include <string.h>
#include <stdlib.h>
#include <unistd.h>
struct Data
{
    char pthread_name[10];
};

void *Pthread_Task(void *arg)
{
    //设置线程取消状态---接受取消请求
    int pthread_setcancelstate_ret = pthread_setcancelstate(PTHREAD_CANCEL_ENABLE, NULL);
    if (pthread_setcancelstate_ret != 0)
    {
        perror("pthread_setcancelstate");
        exit(-1);
    }
    while (1)
    {
        struct Data *p = (struct Data *)arg;
        printf("%s\n", p->pthread_name);
        sleep(1);
    }
    pthread_exit(NULL);
}

int main()
{
    pthread_t pid;
    struct Data d1;
    memset(&d1, 0, sizeof(d1));
    strcpy(d1.pthread_name, "hello");
    //创建线程
    int ret = pthread_create(&pid, NULL, Pthread_Task, (void *)&d1);
    if (ret != 0)
    {
        perror("pthread_create");
        exit(-1);
    }
    printf("5s之后发送取消请求\n");
    sleep(5);
    //取消线程
    pthread_cancel(pid);
    pause();
    return 0;
}

压栈和弹栈要配套使用,想让谁响应注册函数,那么就是谁里面写压栈和弹栈。
代码段:

#include <stdio.h>
#include <errno.h>
#include <pthread.h>
#include <unistd.h>
#include <stdlib.h>
#include <string.h>

//线程注册函数
void Pthread_At_Fun(void *arg)
{
    printf("%s\n", (char *)arg);
}
//线程任务函数
void *Pthread_Task(void *arg)
{   
    //压栈
    pthread_cleanup_push(Pthread_At_Fun, (void *)"死亡闪现");
    printf("三秒之后我将死亡\n");
    sleep(3);
    pthread_exit(NULL);
    //弹栈
    pthread_cleanup_pop(0);  
}
int main()
{
    //创建线程
    pthread_t pid;
    int pthread_create_ret = pthread_create(&pid, NULL, Pthread_Task, NULL);
    if(pthread_create_ret != 0)
    {
        perror("pthread_create");
        exit(-1);
    }
    while(1)
    {
        printf("我看见小线程死亡闪现!\n");
        sleep(1);
    }
    return 0;
}
  系统运维 最新文章
配置小型公司网络WLAN基本业务(AC通过三层
如何在交付运维过程中建立风险底线意识,提
快速传输大文件,怎么通过网络传大文件给对
从游戏服务端角度分析移动同步(状态同步)
MySQL使用MyCat实现分库分表
如何用DWDM射频光纤技术实现200公里外的站点
国内顺畅下载k8s.gcr.io的镜像
自动化测试appium
ctfshow ssrf
Linux操作系统学习之实用指令(Centos7/8均
上一篇文章      下一篇文章      查看所有文章
加:2021-09-07 11:12:00  更:2021-09-07 11:13:27 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/15 14:45:31-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码