线程创建与退出
创建线程:pthread_create()
- 定义:
int pthread_create(pthread_t *restrict tidp, const pthread_attr_t *restrict attr, void*(*start_rtn)(void*), void *restrict arg);
好长一段定义,咱们一个参数一个参数看。
pthread_t *restrict tidp
:成功创建线程后会把新建线程的ID存在这个指针指向的地址空间里。const pthread_attr_t *restrict attr
:用于定制不同的线程属性。attr=attributevoid*(*start_rtn)(void*)
:看不太懂啥意思,反正用来指定新线程运行的函数,传函数名就行。void *restrict arg
:用来指定函数的参数。如果有多个参数,需要用结构体打包传进去。
成功返回0,否则返回错误编号。
restrict是C99标准引入的关键字,用于限定和约束指针,表示这个指针是访问对应地址空间的唯一方式。它可以帮助编译器更好地优化代码,生成更有效率的汇编代码。
线程终止:pthread_exit() & pthread_join() & pthread_cancel()
pthread_exit()
的定义:void pthread_exit(void *rval_ptr);
这个函数只有一个参数,用于指定线程退出时的退出码。调用这个函数之后,线程就会退出。和主线程的exit()
差不多道理,但是线程里调用exit()
会终止整个进程。
pthread_join()
的定义:int pthread_join(pthread_t thread, void **rval_ptr);
第一个参数用来指定一个线程,第二个参数用于接收该线程的退出码。这个函数被调用后会一直被阻塞,直到前面指定的线程退出、返回或被取消了。
成功返回0,否则返回错误编号。
pthread_cancel()
的定义:int pthread_cancel(pthread_t tid);
指定一个线程,强行把它取消了。成功返回0,否则返回错误编号。
一个未被pthread_detach(pthread_t tid)
过的线程执行结束后会保存终止状态,知道这个线程被另一个线程join
。
线程清理:pthread_cleanup_push() & pthread_cleanup_pop()
pthread_cleanup_push()
的定义:void pthread_cleanup_push(void (*rtn)(void *), void *arg);
第一个参数用于指定清理函数,填函数名;第二个参数前面那个函数执行需要的参数。当线程执行以下动作时会调用清理函数:
- 调用
pthread_exit
时; - 响应取消请求时;
- 用非零
execute
参数调用pthread_cleanup_pop()
时。
pthread_cleanup_pop()
的定义:void pthread_cleanup_pop(int execute);
如果将execute参数设置为0,则清理函数不会被调用。无论被发生什么情况,pthread_cleanup_pop()
都会删除上次pthread_cleanup_push()
调用建立的清理处理程序。可以把push
和pop
想象成在一个储存“清理函数”的栈上操作。
有的没的
网抑云(告五人 - 爱人错过)
今天是一个特别的日子,可以网抑云。