linux线程控制

发布时间:2023年12月19日

线程的概念

线程库

线程创建

健壮性较差

每个线程都有自己独立的栈结构

?线程终止

  • void *retval:线程的返回值,可以是任意类型的指针。

调用 pthread_exit 将导致调用线程的终止,并将 retval 作为线程的返回值。该返回值可以由其他线程通过 pthread_join 函数获取。

线程等待

  • thread: 要等待的目标线程的标识符。
  • retval: 是一个指向指针的指针,目标线程结束时,可以通过这个指针获得目标线程的返回值。
  • 返回值:如果函数成功,返回 0;如果出现错误,则返回一个非零错误代码。

pthread_join 的调用将会阻塞调用线程,直到目标线程结束。如果目标线程已经结束,pthread_join 会立即返回。这个函数通常用于确保资源得到释放,或者需要从线程获取计算结果时。在目标线程结束后,与该线程相关的任何资源都会被回收,所以 pthread_join 也是一种防止资源泄露的手段。

关于参数

代码演示

#include<iostream>
#include<cassert>
#include<unistd.h>
#include<pthread.h>
#include<vector>

class ThreadData{
    public:
    char namebuf[1024];
    pthread_t tid;
};

//新线程
void* thread_routine(void* args){
    sleep(1);
    ThreadData* td=static_cast<ThreadData*>(args);
    int cnt=10;
    while(cnt--){
        std::cout<<"cnt:"<<cnt<<"&cnt"<<&cnt<<std::endl;
        std::cout<<"我是新线程 我正在运行"<<std::endl;
        sleep(1);
    }
    delete td;
    pthread_exit(nullptr);
}

int main(){
    pthread_t tid;
    const int num=10;
    std::vector<ThreadData*>threads;
    for(int i=0;i<num;i++){
        ThreadData* td=new ThreadData();
        snprintf(td->namebuf,sizeof(td->namebuf),"%s:%d","thread",i+1);
        pthread_create(&td->tid,nullptr,thread_routine,td);
        threads.push_back(td);
    }
    for(const auto &it:threads){
        std::cout<<"create thread:"<<it->namebuf<<":"<<it->tid<<std::endl;
    }

    
    //主线程
    while (true)
    {
        std::cout<<"我是主线程 我正在运行"<<std::endl;
        sleep(1);
    }
    
    return 0;
}

进程取消

它被用来请求取消同一进程中的另一个线程。当对一个线程调用 pthread_cancel,系统会向那个线程发送一个取消请求,但是是否以及何时响应这个请求取决于目标线程的取消状态和类型。

进程分离

函数接口

pthread库

代码演示

封装一个thread

文章来源:https://blog.csdn.net/b1169909203/article/details/132384911
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。