创建线程和结束线程
1. pthread_create
创建一个线程的函数是pthread_create,定义如下:
#include <pthread.h>
// pthread是新线程的标识符,后续pthread_*函数通过他来引用新线程。
// attr 表示线程属性,attr == NULL时时默认属性。
// start_routin和arg分别表示新线程将运行的函数和参数。
int pthread_create(pthread_t* thread, const pthread_attr_t* attr,
void*(*start_routine)(void*), void* arg);
#include <bits/pthreadtypes.h>
typedef unsigned long int pthread_t;
pthread_create 成功返回0,失败返回错误码。
2.pthread_exit
线程一旦被创建好,内核就可以通过调度内核线程来执行start_routine函数指针所指向的函数了。线程在结束时,最好调用如下函数,保证线程的安全退出。
#include <pthread.h>
void pthread_exit(void * retval);
pthread_exit 函数通过retval 参数向 线程的回收者传递其退出信息。它执行完之后不会回到调用者,而且永远不会。
3. pthread_join
一个进程中的所有线程都可以调用pthread_join函数来回收其他线程。即等待其他线程退出。这类似于回收进程的wait操作。
#include <pthread.h>
int pthread_join(pthread_t pthread, void** retval);
该函数被一直阻塞,直到目标线程被回收为止。
4.pthread_cancel
有时我们希望异常终止**一个线程,即取消线程。它是通过:
int pthread_cancel(pthread_t thread);
thread是线程描述符。
成功时返回0,失败则返回错误码。是否可以取消根据线程的属性来进行判断。
线程属性
pthread_attr_t 结构体定义了一套完整的线程属性。
#include <bits/ pthreadtypes.h>
#define __SIZEOF_PTHREAD_ATTR_T 36
typedef union {
char __size[__SIZEOF_PTHREAD_ATTR_T];
long int __align;
} pthread_attr_t;
这个结构中我们可以看到,线程的各种属性都包含在一个字符数组中。线程库有一系列的函数来操作 pthread_attr_t 类型的变量。