线程库
健壮性较差
每个线程都有自己独立的栈结构
void *retval
:线程的返回值,可以是任意类型的指针。调用 pthread_exit
将导致调用线程的终止,并将 retval
作为线程的返回值。该返回值可以由其他线程通过 pthread_join
函数获取。
thread
: 要等待的目标线程的标识符。retval
: 是一个指向指针的指针,目标线程结束时,可以通过这个指针获得目标线程的返回值。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
,系统会向那个线程发送一个取消请求,但是是否以及何时响应这个请求取决于目标线程的取消状态和类型。
代码演示