环己三烯的冬眠舱

天天网抑云,偶尔读点书。

0%

pthread.h 库(上)

线程创建与退出

创建线程: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=attribute
  • void*(*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);

第一个参数用于指定清理函数,填函数名;第二个参数前面那个函数执行需要的参数。当线程执行以下动作时会调用清理函数:

  1. 调用pthread_exit时;
  2. 响应取消请求时;
  3. 用非零execute参数调用pthread_cleanup_pop()时。
  • pthread_cleanup_pop()的定义:void pthread_cleanup_pop(int execute);

如果将execute参数设置为0,则清理函数不会被调用。无论被发生什么情况,pthread_cleanup_pop()都会删除上次pthread_cleanup_push()调用建立的清理处理程序。可以把pushpop想象成在一个储存“清理函数”的栈上操作。


有的没的

网抑云(告五人 - 爱人错过)

今天是一个特别的日子,可以网抑云。