一、线程相关函数
头文件:#include <pthread.h>
注意:在编译时注意加上-lpthread参数,以调用静态链接库。因为pthread并非linux系统的默认库。
1、pthread_create
函数声明:int pthread_create(pthread_t *thread, const pthread_attr_t *attr, void *(*start_routine)(void *), void *arg);
参数:第一个参数为指向线程标识符的指针,传递一个pthread_t变量地址进来,用于保存新线程的tid(线程ID),可这样定义pthread_t thread1;第二个参数用来设置线程属性,如使用默认属性,则传NULL;第三个参数是线程运行函数的地址,即函数指针,指向新线程应该加载执行的函数模块,函数内包括循环;最后一个参数是运行函数的参数。
返回值:若成功则返回0,否则返回出错编号。pthread库的函数都是通过返回值返回错误号,虽然每个线程也都有一个errno,但这是为了兼容其它函数接口而提供的,pthread库本身并不使用它,通过返回值返回错误码更加清晰。
2、pthread_join
函数pthread_join用来等待一个线程的结束。pthread_join()函数,以阻塞的方式等待thread指定的线程结束。当函数返回时,被等待线程的资源被收回,如果线程已经结束,那么该函数会立即返回,并且指定的线程必须是joinable的。
函数声明:int pthread_join(pthread_t thread, void **retval);
参数:第一个参数是线程标识符,即线程ID,标识唯一线程,为被等待的线程标识符,回收线程tid;第二个参数为用户定义的指针,用来存储被等待线程的返回值(接收退出线程传递出的返回值)。
返回值:如果执行成功将返回0,失败则返回一个错误号。
注意:这个函数是一个线程阻塞的函数,调用它的函数将挂起等待直到被等待的(id为thread的)线程结束为止,当函数返回时,被等待线程的资源被收回。thread线程以不同的方式终止,通过pthread_join得到的终止状态是不同的,总结如下:
如果thread线程通过return返回,retval所指向的单元里存放的是thread线程函数的返回值;如果thread线程是被别的线程调用pthread_cancel异常终止掉,retval所指向的单元里存放的是常数PTHREAD_CANCELED;如果thread线程是自己调用pthread_exit终止的,retval所指向的单元存放的是传给pthread_exit的参数;如果对thread线程的终止状态不感兴趣,可以传NULL给retval参数。
示例:
#include "stdafx.h"
#include <pthread.h>
#include <stdio.h>
#include <Windows.h>
#pragma comment(lib, "pthreadVC2.lib")
static int count = 0;
void* thread_run(void* parm)
{
for (int i=0;i<5;i++)
{
count++;
printf("The thread_run method count is = %d\n",count);
Sleep(1000);
}
return NULL;
}
int main()
{
pthread_t mythread;
pthread_create(&mythread, NULL, thread_run,NULL);
// 加入pthread_join后,主线程"main"会一直等待直到tid这个线程执行完毕自己才结束
// 一般项目中需要子线程计算后的值就需要加join方法
pthread_join(mythread,NULL);
// 如果没有join方法可以看看打印的顺序
printf("The count is = %d\n",count);
getchar();
return 0;
}
gcc thread.c -o thread -pthread
加了pthread_join()方法的打印:
如果把里面的pthread_join()方法注释掉的打印:
3、pthread_exit
函数声明:void pthread_exit(void *retval);
参数:线程退出时传递出的参数,可以是退出值或地址。是地址时,不能是线程内部申请的局部地址。
注意:任何线程里exit()函数导致进程退出,其他线程未结束工作,主线程退出时不能return或exit()。需要注意,pthread_exit或者return返回的指针指向的内存单元必须是全局的或者是malloc分配的,不能在线程函数的栈上分配,因为当其它线程得到这个返回指针时线程函数已经退出了。
4、pthread_cancel
函数声明:int pthread_cancel(pthread_t thread);
定义在Linux的pthread库中常数PTHREADCANCELED的值是-1,可以在头文件pthread.h中找到它的定义:#define PTHREAD_CANCELED((void *) -1)