linux 上线程(pthread)的运用

1.Linux线程的发展

   早在LINUX2.2内核中。并不存在真正意义上的线程,当时Linux中常用的线程pthread实际上是通过进程来模拟的,也就是同过fork来创建“轻”进程,并且这种轻进程的线程也有个数的限制:最多只能有4096和此类线程同时运行。
   2.4内核消除了个数上的限制,并且允许在系统运行中动态的调整进程数的上限,当时采用的是Linux Thread 线程库,它对应的线程模型是“一对一”,而线程的管理是在内核为的函数库中实现,这种线程得到了广泛的应用。但是它不与POSIX兼容。另外还有许多诸如信号处理,进程ID等方面的问题没有完全解决。
   相似新的2.6内核中,进程调度通过重新的编写,删除了以前版本中的效率不高的算法,内核框架页也被重新编写。开始使用NPTL(Native POSIX Thread Library)线程库,这个线程库有以下几个目标: POSIX兼容,都处理结果和应用,底启动开销,低链接开销,与Linux Thread应用的二进制兼容,软硬件的可扩展能力,与C++集成等。 这一切是2.6的内核多线程机制更加完备。

2.Linux 线程的实现

Linux线程的基本操作
这里主要讲的线程以及相关操作都是用户空间的线程操作,在Linux中,一般pthread线程库是一套通用的线程库,是由POSIX提出的,因此具有很好的可移植性。
  2.1 线程的创建: 创建线程通常使用的函数是pthread_create.

  2.2 线程的退出:

      1) 在线程创建以后,就开始运行相关的线程函数,在该函数运行完之后,该线程也就退出了。这是线程退出的一种方法: 运行完毕,自动退出;

      2) 调用pthread_exit函数主动退出;

      3) 进程终止函数exit函数,一旦结束了进程,那么此进程中所有线程都将无条件终止。
一个注意点:在默认线程属性下,如果一个进程有很多线程在同时运行,一个线程在退出以后,当前线程所占用的资源并不会随着线程的终止而得到释放。因为所有处在一个进程中的线程共享资源。
线程中还有一个常用函数:pthread_join函数可以用于将当前线程挂起,等待其他线程结束。实际上,这个函数是就是一个线程阻塞函数,调用它的函数将一直等待到被等待的线程结束为止。当函数返回时,被等待线程的资源就被回收。
pthread_create 函数:

所需文件头:

#include <pthread.h>

函数原型:

int pthread_create((pthread_t*thread,pthread_attr_r*attr,void*(*start_routine)
(void*),void *arg))

函数传入值:

thread:线程标识符

 

attr: 线程属性设置 null表示采用默认

 

start_roitine : 线程函数的启示地址

 

arg :传递给start_routine的参数

函数返回值:

成功:0
出错:-1

pthread_exit函数

所需文件头:

#include <pthread.h>

函数原型:

Void pthread_exit(void *retval)

函数传入值:

retval:调用者线程的返回值,可由其他函数如pthread_join来检索获取。

pthread_join函数

所需文件头:

#include <pthread.h>

函数原型:

int pthread_join ((pthread_t th,void **thread_return))

函数传入值:

th: 等待线程的标识符
thread_return:用户定义的指针,用来存储被等待线程的返回值(不为NULL时)

函数返回值:

成功:0

 

出错:-1

取消一个线程
有时候,我们想让一个线程 能够请求另外一个线程结束,就像给它发送一个信号似的。用线程程是可以完成这一操作的,而与单处理经,线程在被要求结束执行的时候还有一种改变其行为的办法。
我们来看看要求一个线程结束执行的函数

所需文件头:

#include <pthread.h>

函数原型:

int pthread_cancel(pthread_t thread);

函数传入值:

thread:线程的标识符

函数返回值:

成功:0

 

出错:-1

这个定义很明白,给定一个线程标识符,我们就能要求取消它。但在取消线形程请求的接收端,事情会稍微复杂一些,好在也不是太复杂。线形程可以用pthread_setcancelstate设置自己的取消状态,下面是这个函数的定义:

所需文件头:

#include <pthrea.h>

函数原型:

int pthread_setcancelstate(int state,int *oldstate);

函数传入值:

state:可以是PTHREAD_CANCEL_ENABLE,这个值允许线程接收取消请求;还可以是PTHREAD_CANCEL_DISABLE,它的作用是屏幕它们。
线程以前的取消状态可以用oldstate指针检索出来。如果没兴趣可以传一个NULL进去。

函数返回值:

成功:0

 

出错:-1

如果取消请求被接受了,线程会进入第二个控制层次----用pthread_setcanceltype设置取消类型。

所需文件头:

#include <pthrea.h>

函数原型:

int pthread_setcanceltype(int type,int *oldstate);

函数传入值:

type:可以有两种取值,一个是PTHREAD_CANCEL_ASYNCHORONOUS,接收到取消请求之后立刻采取行动;另一个是PTHREAD_CANCEL_DEFERRED,在接收到取消请求之后、采取实际行动之前,先执行以下几个函数之一:pthread_join、pthread_cond_wait、pthread_cond_timewait、pthread_testcancel、sem_wait或sigwait。

函数返回值:

成功:0

 

出错:-1

稍微注意一点就是在android-ndk-r3 里是不支持int pthread_cancel(pthread_t thread); 所以想强制退出线程似乎没有更好的办法。

 

原文链接: https://www.cnblogs.com/Caiqinghua/archive/2010/09/22/1833105.html

欢迎关注

微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍

    linux 上线程(pthread)的运用

原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/15292

非原创文章文中已经注明原地址,如有侵权,联系删除

关注公众号【高性能架构探索】,第一时间获取最新文章

转载文章受原作者版权保护。转载请注明原作者出处!

(0)
上一篇 2023年2月7日 下午3:14
下一篇 2023年2月7日 下午3:16

相关推荐