【Linux】线程控制

话不多说,直接进入正题!!!😁

1. 什么是线程?
  • Linux下的线程是一个轻量级进程,是cpu调度的基本单位。
2. 线程控制
  • 线程控制包括:线程创建、线程等待、线程分离、线程退出。
2.1 线程创建
int pthread_create(pthread_t *tid, pthread_attr_t *attr, void *(*start_routine)(void*), void *arg); 

tid:返回线程ID
attr:设置线程的属性,attr为NULL表示使用默认属性 ,平常置空
start_routine:是个函数地址,线程启动后要执行的函数 
arg:传给线程启动函数的参数 

返回值:成功返回0;失败返回错误码。
2.2 线程等待

【为什么要线程等待】

  • 已经退出的线程,其空间没有被释放,仍然在进程的地址空间内;
  • 创建新的线程不会复用刚才退出线程的地址空间。
int pthread_join(pthread_t thread, void **value_ptr); 

参数 
    thread:线程ID 
    value_ptr:它指向一个指针,后者指向线程的返回值 

返回值:成功返回0;失败返回错误码
2.3 线程分离
  • 一个线程创建出来,默认在退出时是不会释放所有资源的,因为线程有一个属性–joinable,处于joinable状态的线程,退出后不会自动释放资源,需要被等待;
  • 将线程的属性从joinable设置成detach,表示分离一个线程;
  • 处于detach属性的线程退出后,则会自动释放所有资源。
int pthread_detach(pthread_t, tid); //线程组内其他线程对目标线程进行分离

pthread_detach_self(void); //线程自己分离

注意:joinable和分离是冲突的,一个线程不能既是joinable又是分离的
2.4 线程退出
  1. return
线程将自己的入口函数运行完毕return退出。
  1. pthread_exit函数
void pthread_exit(void *value_ptr);  //退出调用线程
  1. pthread_cancel函数
int pthread_cancel(pthread_t thread);  //取消一个执行中的线程
3. 例子
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <pthread.h>

void *thr_start(void *arg) //线程入口函数
{
    pthread_detach(pthread_self()); //线程分离:分离自己
    sleep(5);
    char *ptr = "hahahah~~\n";
    pthread_exit(ptr); //线程终止

    while(1) {
        printf("child thread----%s\n", (char*)arg); //(char*)强转
        sleep(1);
    }
    return NULL;
}

int main()
{
    pthread_t tid;
    char *ptr = "this is thread\n"; 
    int ret = pthread_create(&tid, NULL, thr_start, (void*)ptr); //创建线程 
    if (ret != 0) {
        perror("thread create error"); //返回错误编号
        return -1;
    }

    //pthread_detach(tid); //线程分离
    
    char *retval; //想获取一个一级指针的值,对一级指针取地址传入它的二级指针
    pthread_join(tid, (void**)&retval); //线程等待
    printf("retval:%s\n", retval);

    //sleep(5);
    //pthread_cancel(tid); //线程终止:取消一个执行中的线程

    while(1) {
        printf("main thread----%p\n", tid);
        sleep(1);
    }

    return 0; //线程终止:return
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值