Linux 软件系列之十二——线程编程

1.线程是进程中程序执行的最小单位。是并发执行的多道执行路径,他们共享一个进程的资源。

线程通常都是在一个进程中创建的。线程不能独立于进程单独存在。

进程是系统中程序执行和资源分配的基本单位。每个进程都有自己的数据段、代码段和堆栈段。

2.在Linux中,一般采用pthread线程库实现线程的创建、访问和控制。

Linux 软件系列之十二——线程编程_第1张图片

线程标识符thread就是线程的名字,唯一标识一个线程的。使用时先定义一个pthread_t类型的变量,然后将地址传递到这个函数中。

attr一般使用NULL,表示采用默认属性。如果需要向start_routine函数传递的参数不止一个,那么需要把这些参数放到一个结构中,然后把这个结构的地址作为arg的参数传入。

注意:

原进程称为主线程。

编译时要加上-lpthread静态链接库。例如:gcc test.c -o test -lpthread

在没有加-lpthread的时候往往会出现这种错误:test.c:(.text+0x55): undefined reference to `pthread_create'。.text+地址:说明不是因为没包含头文件,而是因为没有找到函数体。

pthread线程库不是Linux系统标准的API。

进程间的通信方式同样适用于线程间通信。

3.动态链接库和静态链接库

静态链接库:这类库的名字是libxxx.a;利用静态链接库编译成的文件比较大,因为整个链接库的所有数据都会被整合进目标代码中,他的优点就显而易见了,即编译后的执行程序不需要外部的函数库支持,因为所有使用的函数都已经被编译进去了。当然这也会成为他的缺点,因为如果静态链接库改变了,那么你的程序必须重新编译。

动态链接库:这类库的名字是libxxx.so;相对于静态链接库,动态链接库在编译的时候 并没有被编译进目标代码中,你的程序执行到相关函数时才调用该链接库里的相应函数,因此动态链接库所产生的目标文件比较小。由于链接库没有被整合进你的程序,而是程序运行时动态的调用,所以程序的运行环境中必须提供相应的库。动态链接库的改变并不影响你的程序,所以动态链接库的升级比较方便。

linux系统有几个重要的目录存放相应的函数库,如/lib /usr/lib。

4.线程的退出:

1)线程运行结束自动退出。也可以是使用return结束。

2)使用pthread_exit退出。

3)执行exit(_exit)退出。当执行了exit,则进程退出,此时,进程中的所有线程也都将无条件退出。如果线程中调用exit(_exit),那么这个进程以及这个进程中的线程都退出。

Linux 软件系列之十二——线程编程_第2张图片

pthread_exit(retrval)中的retrval和exit(status)中的status做比较进行理解。

Linux 软件系列之十二——线程编程_第3张图片

功能:等待线程结束,获取线程退出时的状态。会将当前线程挂起,等待指定的线程结束。这个函数是一个阻塞函数。

pthread_exit()返回信息在实际工作的使用如下:在一个线程中使用malloc,申请一段内存空间,将返回的信息数据保存在这段内存中。在使用pthread_join的函数中,获取这个地址,从中取出信息,然后使用free释放这段内存空间。

5.线程的访问控制

线程的访问控制就是指线程间的同步和互斥。

线程间的同步:指线程间的协同工作。一个生产,一个消费。一个生产一个,一个就消费一个。

线程间的互斥:指线程共享进程的资源时,对资源的上锁行为,在同一时间保证只有一个线程使用资源。

进程间的通信方式全部都应用于线程间通信。

互斥锁:因为使用信号量功能强,但是很繁琐。所以引入了互斥锁,用于实现一般简单的互斥操作。互斥锁(mutex)是一种简单的加锁方法,用来实现对共享资源的存取。这个互斥锁只有两个状态:上锁和解锁。可以把互斥锁看做某种意义上的全局变量。在同一时刻只能有一个线程掌握某个互斥锁上锁,拥有上锁状态的线程能够对共享资源进行操作。若其他线程希望上锁一个已经上锁的互斥锁,那么该线程就会挂起,直到上锁的线程释放掉互斥锁为止。

pthread_mutex_t  mutex=PTHREAD_MUTEX_INITIALIZER;

快速锁是指调用线程会阻塞,直到用有互斥锁的线程解锁为止;检错互斥锁是非阻塞版本,会立刻返回错误消息;递归互斥锁能成功返回并增加调用线程在互斥上加锁的次数。

Linux 软件系列之十二——线程编程_第4张图片

Linux 软件系列之十二——线程编程_第5张图片

trylock函数是非阻塞调用模式, 也就是说, 如果互斥锁没被上锁, trylock函数将把互斥锁上锁, 并获得对共享资源的访问权限; 如果互斥锁被上锁了, trylock函数将不会阻塞而直接返回EBUSY, 表示共享资源处于忙状态。

你可能感兴趣的:(Linux系统)