POSIX Threads(通常简称为 Pthreads)定义了创建和操纵线程的一套 API 接口, 一般用于 Unix-like POSIX 系统中(如 FreeBSD、 GNU/Linux、 OpenBSD、 Mac OS 等系统)。
编写 Pthreads 多线程的程序时, 源码只需要包含 pthread.h 头文件就可以使用 Pthreads库中的所有类型及函数:
#include <pthread.h>
在编译 Pthread 程序时在编译和链接过程中需要加上-pthread 参数:
LDFLAGS += -pthread
1、创建线程
int pthread_create(pthread_t *thread, const pthread_attr_t *attr,
void *(*start_routine) (void *), void *arg);
thread 用来指向新创建线程的 ID;
attr 用来表示一个封装了线程各种属性的属性对象,如果 attr 为 NULL,新线程就使用默认的属性;
start_routine 是线程开始执行的时候调用的函数的名字, start_routine 函数有一个指
向 void 的指针参数,并有 pthread_create 的第四个参数 arg 指定值,同时 start_routine
函数返回一个指向 void 的指针,这个返回值被 pthread_join 当做退出状态处理。
arg 为参数 start_routine 指定函数的参数。
线程被创建后将立即运行。
实例:
void *usart_receive(void *arg)
{
;
}
int main
{
pthread_t tid;
int ret;
ret=pthread_create(&tid,NULL,imx_yulinjun_handler,NULL);
}
2、终止线程
进程的终止可以通过直接调用 exit()、执行 main()中的 return、或者通过进程的某个其它
线程调用 exit()来实现。在以上任何一种情况发生时,所有的线程都会被终止。如果主线程
在创建了其它线程后没有任务需要处理,那么它应该阻塞等待直到所有线程都结束为止,或
者应该调用 pthread_exit(NULL)。
调用 exit()函数会使整个进程终止,而调用 pthread_exit()只会使得调用线程终止,同时
在创建的线程的顶层执行 return 线程会隐式地调用 pthread_exit()。 pthread_exit()函数原型如
下:
void pthread_exit(void *retval);
retval 是一个 void 类型的指针,可以将线程的返回值当作 pthread_exit()的参数传入,这
个值同样被 pthread_join()当作退出状态处理。如果进程的最后一个线程调用了 pthread_exit(),
进程会带着状态返回值 0 退出。
3、连接和分离
线程是可结合的(joinable)或者是分离的(detached)。一个可结合的线程能够被其他线程收回其资源和杀死。在被其他线程回收之前,它的存储器资源(例如栈)是不释放的。相反,一个分离的线程是不能被其他线程回收或杀死的,它的存储器资源在它终止时由系统自动释放。
默认情况下,线程被创建成可结合的。为了避免存储器泄漏,每个可结合线程都应该要么被显示地回收,即调用pthread_join;要么通过调用pthread_detach函数被分离。
实例:
void *usart_receive(void *arg)
{
;
}
int main
{
pthread_t tid;
int ret;
ret=pthread_create(&tid,NULL,imx_yulinjun_handler,NULL);
pthread_join(tid,NULL);
}