Day37
线程的概念
线程是进程的子任务,进程有自己的内存区,一个进程内的所有线程共享进程的代码区,数据区、BSS区、命令行参数、环境变量,只有栈区是一个线程一个
一个进程可以有多个线程并发运行,它们可以执行相同的代码,也可以执行不同的代码
线程函数
#include <pthread.h>
int pthread_create(pthread_t* tid, pthread_attr_t const* attr, void*(*start_routine)(void*), void* arg);
功能:创建新线程
参数:tid 输出线程ID(unsigned long int类型)
attr 线程属性,NULL表示缺省
start_routine 线程过程函数,所指向函数将在被创建的线程中执行
arg 传递给线程过程函数的参数
返回值:成功返回0,失败返回-1
线程过程函数
void* pthread_proc(void* arg){......}
⭐main函数其实是主线程的线程过程函数,main函数一旦返回意味着进程即将结束,所有子进程都会结束
⭐prhread_create函数本身不调用线程过程函数,而是在内核中开启独立线程并立即返回,后续在该线程中执行线程过程函数(多个子进程自由并发执行)
传递给线程函数的参数是泛型指针void*,可以指向任何类型的数据,但在线程函数执行期间必须持久有效
#include <pthread.h>
int pthread_join(pthread_t tid, void** retval);
功能:等待子线程终止(阻塞型),与之会合,同时回收该线程资源
参数:tid 线程ID
retval 输出线程过程函数的返回值
返回值:成功返回0,失败返回错误码
分离线程
线程终止后会被系统自动回收资源,不需要也无法通过pthread_join函数汇合它
线程属性
_detachstate 分离状态
_schedpolicy 线程调度算法
_schedparam 线程的优先级
_scope 争夺CPU资源范围
_stacksize 线程栈大小
_guardsize 警戒缓冲区大小
以分离属性为例演示线程属性的设置
pthread_attr_t myAttr;
pthread_attr_init(&myAttr);
pthread_attr_setdetachstate(&myAttr, PTHREAD_CREATE_DETACHED);
pthread_create(&tid, &myAttr, pthread_fun, NULL);