各位看官们,大家好,上一回中咱们说的是线程概述的例子,这一回咱们说的例子是:线程创建与结束。闲话休提,言归正转。让我们一起talk C栗子吧!

看官们,我们这一回介绍一下如何创建和结束线程。线程通常是随着进程的创建而创建的,因为线程依赖于进程,进程创建成功后会创建线程来完成一些工作。比如我们在上一回中介绍的firefox进程,它在启动的时候创建了很多线程。

线程的结束通常由进程来控制,进程依据程序的需要来结束线程。不过有一点可以肯定的是:使用exit函数结束进程时,该进程创建的线程会随着进程的结束而结束。

我这么说,大家可能感觉比较抽象,接下来我们通过具体的例子来说明如何创建和结束线程。在介绍之前,我们先介绍三个与线程相关的函数:

1.pthread_create函数

int pthread_create(pthread_t *thread, const pthread_attr_t *attr,
                          void *(*start_routine) (void *), void *arg);

该函数用来创建线程,该函数有四个参数,接下来我们分别介绍它们:

第一个参数是pthread类型的指针,函数运行成功后,该指针指向新创建线程的标识符,我们可以通过操作线程的标识符来操作线程; 第二个参数是pthread_attr_t类型的指针,该指针指向包含有线程属性的变量,这些属性会赋值给新创建的线程。如果我们不想修改线程的属性,那么可以使用空指针; 第三个参数是一个函数指针,该指针指向的函数拥有一个参数,参数类型是void类型的指针,函数返回 void类型的指针。新线程创建成功后会执行该函数; 第四个参数是void类型的指针,该指针指向的变量被当作第三个参数中函数的参数; 该函数运行成功时返回零,否则返回相应的错误代码。

2.pthread_exit函数

void pthread_exit(void *retval);

该函数用来结束线程,该函数只有一个参数。

参数为void类型的指针,该指针指向的变量包含有线程结束时的内容。它通常用来存放线程结束的状态。 该函数运行成功时返回零,否则返回相应的错误代码。

3.pthread_join函数

int pthread_join(pthread_t thread, void **retval);

该函数用来等待线程结束,通常用来做简单的同步,它的作用类似于进程中的wait函数;

第一个参数是pthread_t类型的变量,它包含着线程的标识符,我们可以通过pthread_create函数的第一个参数来得到该变量的值; 第二个参数是一个二级指针,它指向pthread_exit函数的参数,因此,通常情况下我们用该指针来获取线程结束时的状态; 该函数运行成功时返回零,否则返回相应的错误代码。

使用这三个函数的时候都需要包含 “pthread.h”头文件。另外,在我们使用的Mint中该文件的位置如下:

/usr/include/pthread.h

大家可以打开看看里面的内容。比如该文件中pthread_create函数的原型如下:

extern int pthread_create (pthread_t *__restrict __newthread,
                           const pthread_attr_t *__restrict __attr,
                           void *(*__start_routine) (void *),
                           void *__restrict __arg) __THROWNL __nonnull ((1, 3));

该函数看着很复杂,其它和我们刚才介绍的一样,只不过是在函末尾多了个小尾巴而已。

各位看官,关于线程创建与结束的例子咱们就说到这里。欲知后面还有什么例子,且听下回分解 。