一、linux下安装posix手册
apt-get install manpages-posix-dev
- man -k pthread 查看posix函数列表
- man [函数名] 查看函数的具体用法
pthread库不是Linux系统默认的库,连接时需要使用静态库libpthread.a,所以在线程函数在编译时,需要连接库函数: gcc pthread_create.c -o pthread_create -lpthread
二、posix线程相关函数
- pthread_create函数
函数原型:int pthread_create(pthread_t *thread, const pthread_attr_t *attr, void *(*start_routine) (void *), void *arg);
函数功能:创建一个线程
函数参数:pthread_t 线程id
pthread_attr_t 线程属性,为空时使用默认属性
start_routine 需要运行的函数
arg 传递给start_routine的参数
返回值: 成功返回0,失败返回对应的错误类型;
说明: 1)线程的退出可以使用pthread_exit退出,也可以直接return退出;
2)如果创建线程的main函数退出,该main函数中的所有线程都将被销毁;
2.pthread_join函数
函数原型:int pthread_join(pthread_t thread, void **retval);
函数功能:等待线程结束
函数参数:thread 线程ID
retval 线程函数的返回值
返回值:成功返回0,失败返回对应的错误类型
说明:调用该函数会阻塞直到对应的线程退出,目的是在线程结束时回收线程的相关资源。
3.pthread_detach函数
函数原型:int pthread_detach(pthread_t thread);
函数功能:调用该函数后,线程在运行结束后会自动释放系统分配的资源,而不需要调用pthread_join等待线程结束。
函数参数:thread 线程ID
返回值:成功返回0,失败返回对应的错误类型
4.pthread_exit函数
函数原型:void pthread_exit(void *retval);
函数功能:结束一个线程,等同于return
函数参数:retval 需要返回的参数
返回值:无
说明:retval指向的变量不能是栈变量,因为栈变量在函数退出时会自动销毁。
5.pthread_self()函数
函数原型: pthread_t pthread_self(void);
函数功能:获取当前线程的id
函数参数:无
返回值:返回当前线程的id号
三、线程的detached和joinable属性
- [1] 线程在创建时默认属性是joinable的,也就是说在线程退出时必须调用pthread_join来等待线程结束,回收线程的资源,优点类似于进程中的僵尸进程;
- [2]如果将线程属性设置为detached,那么在线程退出时,系统会自动回收线程的相关资源,而不必调用pthread_join等待线程结束。
示例:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <pthread.h>
void posix_thread_test();
pthread_t g_pthread_id;
int main()
{
posix_thread_test();
}
void *test_fn(void *param)
{
int *retval = NULL;
retval = malloc(sizeof(int));
*retval = 33;
if(NULL != param)
{
printf("%s\r\n",param);
}
pthread_exit((void*)retval);
//return retval;
}
void posix_thread_test()
{
int ret = -1;
void *pret = NULL;
pthread_attr_t *attr=NULL;
char arg[] = "test func param";
ret = pthread_create(&g_pthread_id,attr,test_fn,arg);
if(0 == ret)
{
printf("create thread sucess,id %u\r\n",g_pthread_id);
}
else
{
printf("thread create fail\r\n");
}
ret = pthread_join(g_pthread_id,&pret);
if(0 == ret)
{
printf("test thread exit,exit param:%d\r\n",*(int*)pret);
free(pret);
}
}
运行结果
注意上述例程中test_fn中retval是使用malloc分配的内存,所以在pthread_join之后需要主动释放。