对于这个简单的示例,步骤非常简单:创建线程-线程退出-同步退出。
对于POSIX
线程相关的函数,无论是变量,还是属性,凡是有要使用的,一般都将会传入对象的地址,目前只有pthread_joint
除外,传入的是变量的值。另外,Linux函数的返回值非常有规律,没有消息(等于0
)就是好消息,如果有就是坏消息(不为0
的错误代码)。这么一说其实fopen
其实有点不一样,此外,pthread
类相关的函数不会设置错误代码。
- 定义宏
__REENTRANT
,开启可重入功能 - 引用头文件
#include
- 编译链接库
-lpthread
pthread_create()
函数的原型如下:
int pthread_create(pthread_t * thread,pthread_attr_t * attr,\
void *(*start_rountine)(void *),void * arg)
输入参数可以用一句话说明: “线程及其属性,入口及其参数”
第一个参数类似于文件指针fp
,用户通过这个指针来操作线程对象。
第二个参数类似于文件的打开方式,用户通过这个来设置线程线程对象属性。在不深入的情况下,设置为NULL(使用默认参数)即可。
第三个参数是一个函数指针,函数的输入和输出都为一个空指针void *
,指针名字为* start_rountine
, 通常就是&函数名
第四个参数是一个参数也是一个空指针,类型解释的权利在函数内部,通常就是传入&变量or 结构体名
函数成功创建一个线程则返回0
,创建失败则返回错误代码(非0)。
pthread_exit()
函数原型如下:
void pthread_exit(void * retval)
终止一个线程并返回某个对象的指针。注意不要返回一个局部变量。pthread_exit()
等同于函数的return
语句。
pthread_join()
int pthread_join(pthread_t th,void **thread_return);
等待指定线程结束。
第一个参数是:要等待的线程
第二个参数是:指针的指针,最后指向线程返回值。
五、程序[1]#include
#include
#include
#include
#include
char message[]="Hello Thread World";
void *thread_function(void *arg)
{
printf("thread function is running, Argument is %s\n",(char *)arg);
sleep(3);
strcpy(message,"Bye!");
pthread_exit((void *)"Thank you for the CPU time");
}
int main()
{
int res;
pthread_t a_thread;
void *thread_result;
res=pthread_create(&a_thread,NULL,thread_function,(char *)message);
if(res!=0)
{
perror("thread creation failed");
exit(EXIT_FAILURE);
}
printf("Waiting for thread to finish....\n");
res=pthread_join(a_thread,&thread_result);
if(res!=0)
{
perror("Thread join failed");
exit(EXIT_FAILURE);
}
printf("Thread joined, it return %s\n",(char *)thread_result);
printf("Messege is now %s\n",message);
exit(EXIT_SUCCESS);
}
[1]马修, N. ), 斯通斯,等. Linux程序设计: 第4版[M]. 人民邮电出版社, 2010.