欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

一起talk C栗子吧(第一百零八回:C语言实例--线程创建与结束一)

程序员文章站 2022-03-10 15:07:01
各位看官们,大家好,上一回中咱们说的是线程概述的例子,这一回咱们说的例子是:线程创建与结束。闲话休提,言归正转。让我们一起talk c栗子吧! 看官们,我们这一回介绍一下如何创建和结束线程。线程通...

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

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

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

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

1.pthread_create函数

delphi">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));

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

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