话不多说,直接进入正题!!!😁
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 线程退出
- return
线程将自己的入口函数运行完毕return退出。
- pthread_exit函数
void pthread_exit(void *value_ptr); //退出调用线程
- 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
}