Linux程序设计——线程

Linux程序设计—线程

线程是一个进程内部的一个控制序列,可以理解为:线程是运行在进程上下文中的逻辑流。

线程是由内核自动调度的,它们有自己的线程上下文,上下文中记录了线程正常运行所需要的状态,比如:唯一的线程ID,栈,栈指针,程序计数器,通用目的寄存器和条件码。

多个线程可以运行在单一进程的上下文中,所以它们共享该进程虚拟地址空间的所有内容,比如:代码、数据、堆、共享库和打开的文件。

但是,一定要搞清楚fork系统调用和创建新进程之间的区别。

进程执行fork调用时,将创建出该进程的一份新副本,这个新的进程拥有自己的变量和PID,它的时间调度是独立的,执行几乎完全独立于父进程。

当在进程中创建一个新的线程时,新的执行线程将拥有自己的栈(因此也有自己的局部变量),但是会和它的创建者共享全局变量、文件描述符、信号处理函数和当前目录状态。

在简单点,可以认为,一个程序是一个进程,而这个进程的运行由多个线程组成。

线程执行模型
线程的执行是不同于进程的,它不是按照严格的父子层次来组织的。和某一个进程相关的线程,它们组成了线程池,而这个线程池的主要影响是:一个线程可以杀死它的任何对等线程,或者等待它的任意对等线程终止。另外,每个对等线程都能读写相同的共享数据。

并发线程执行图:
Linux程序设计——线程_第1张图片

线程函数
创建线程:

#include
typedef void *(func)(void *);
int pthread_create(pthread_t *thread,pthread_attr_t *attr, func *f,void *arg)

线程被创建时,*thread中将被写入一个标识符,我们用该标识符来引用新线程。
*attr用来改变新线程的属性。
*f,新线程将要执行的函数的入口地址。
*arg,用来做线程执行的函数的参数变量。

新线程如何获取自己的线程ID:

#include
pthread_t pthread_self(void);

终止线程:
一个线程是以下列方式之一来终止的:
1、当顶层的线程例程返回时,隐式终止;
2、调用pthread_exit函数,显示终止。

#include
void pthread_exit(void *thread_return);

另一个对等线程通过以当前线程的ID作为参数,调用pthread_cancle函数来终止当前线程。

#include
Int pthread_cancle(pthread_t tid); 

回收已终止线程的资源:

#include
Int pthread_join(pthread_t tid,void **thread_return);

pthread_join 函数会阻塞,只到编号为 tid 的这个线程终止,把线程例程返回的 (void*) 指针赋值为 thread_return 指向的位置,然后回收已终止线程占用_的所有存储器资源。

以上就是线程的简单介绍。

你可能感兴趣的:(linux程序设计)