POSIX线程(POSIX threads),简称pthreads,是线程的POSIX标准。该标准定义了创建和操纵线程的一整套API。在类Unix操作系统(Unix、Linux、Mac OS X等)中,都使用pthreads作为操作系统的线程。
由于最近学习过程中接触到了多线程,所以用到了pthread,在此写下自己的一些收获,也顺便给自己的脑袋加深印象。
pthread函数库的安装
pthread不是Linux下的默认的库,所以在linux环境下,有的有些系统没有安装有pthread,所以在编译有关多线程程序时,也就是在程序链接的时候,无法找到pthread库中函数的入口地址,于是链接会失败。所以在此我们必须先安装好pthread库。安装过程很简单使用下面命令即可。
sudo apt-get install glibc-doc
sudo apt-get install manpages-posix-dev
然后再用man -k pthread就可以查找到当前manpages中关于pthread的手册
多线程小例子
安装好pthread库之后,我们就可以编写自己的多线程小程序啦。下面是我自己弄的一个简单小例子。
main.c
#include <stdio.h>
#include<pthread.h>
void *thread_call(void*arg);
int main(void)
{
pthread_t thread_id;
int i,ret_num;
ret_num=pthread_create(&thread_id,NULL,thread_call,NULL);
if(ret_num!=0)
{
printf("The thread create failed!!\n");
return -1;
}
for(i=0; i<3; i++)
printf("This is the main process.\n");
pthread_join(thread_id,NULL);
return 0;
}
void *thread_call(void*arg)
{
int j;
for(j=0; j<3; j++)
{
printf("This is a pthread.\n");
}
}
将上述代码保存为main.c文件,注意观察,我们头文件加入了pthread.h。接下来就可以进行编译了,在这个地方值得注意的是: pthread 库不是 Linux 系统默认的库,连接时需要使用静态库 libpthread.a,所以在编译的时候需要链接该库。
所以在编译中要加 -lpthread参数,命令为:
gcc main.c -lpthread -o main
运行上述命令就编译好了,生成可执行文件main。输入执行命令./main 运行结果如下
注意:因为是多线程,输出结果的顺序是不一定的,这个和计算机的性能有关,因为本程序比较小,看不出什么效果。
在代码中我用到了两个在多线程程序中经常用到的两个函数:创建线程函数pthread_create()和阻塞线程函数pthread_join()。下面我稍微对两个函数稍微做一下讲解。
pthread_create(pthread_t thread, const pthread_attr_t *attr, void (start_routine)(void*), void *arg);
start_routine为新线程的入口函数,arg为传递给start_routine的参数。
每个线程都有自己的线程ID,函数第一个参数为线程id,以便在进程内区分。线程ID在pthread_create调用时回返给创建线程的调用者。pthread_join (pthread_t thread, void** threadreturn);
如果一个线程要等待另一个线程的终止,可以使用pthread_join函数,该函数的作用是调用pthread_join的线程将被挂起直到线程ID为参数thread的线程终止。第一个参数为线程id。
对上述的代码就分析到此,有关pthread的操纵函数还有很多,百度pthread 就可以全部看到,大家可以自己查阅,在这里就不多说啦。