一、线程的概念

  1、线程在进程中是负责执行代码的一个单位,可以说线程是进程的一部分。一个进程中至少要有一个主线程,进程可以拥有多个线程。

  2、线程和进程一样,线程会共享进程的一些信息。比如,代码段、全局段、静态数据区、堆、命令行、环境变量表等,但栈是每个线程私有的。

  3、严格来说,线程是进程的一个实体,是操作系统独立调度和分派任务的基本单位。

二、POSIX线程

  UNIX和Linux不支持线程处理,但有额外的线程库可以调用。在编辑时要加<pthread.h>的线程库头文件,在编译时要加 -lpthread

三、创建线程

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

  功能:创建线程

  thread:返回值,获取线程id

  attr:返回值,获取线程属性

  start_routine:参数,注册线程的入口函数

  arg:给线程入口函数的参数

  1、同一个进程的多个线程都在同一个地址空间内活动,因此相对于进程,线程的系统开销小,任务切换快,它们可以执行相同的代码,也可以执行不同的代码。

  2、线程间的数据交换不需要依赖于类似IPC的特殊通信机制,简单而高效,每个线程拥有自己独立的线程ID、寄存器信息、函数栈、错误码和信号掩码,线程之间存在优先级的差异。

  3、main函数即主线程,main函数返回即主线程结束,主线程结束即进程结束,进程一但结束其所有的线程即结束。

  4、应设法保证在线程过程函数执行期间,其参数所指向的目标持久有效。

四、对线程的操作

  1、等待线程

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

  功能:等待thread参数所标识的线程结束

  retval:返回值,线程入口函数的返回值

  返回值:成功返回0,失败返回错误码。

  线程过程函数将所需返回的内容放在一块内存中,返回该内存的地址,要保证这块内存在函数返回后,即线程结束,以后依然有效;  

  若retval参数非NULL,则pthread_join函数将线程过程函数所返回的指针,拷贝到该参数所指向的内存中;

  若线程过程函数所返回的指针指向动态分配的内存,则还需保证在用过该内存之后释放之。

  2、获取线程id

  pthread_t pthread_self (void);

  功能:返回当前线程的id,此函数不会执行失败。

  3、比较两个线程

  int pthread_equal (pthread_t t1, pthread_t t2);  

  功能:比较两个id是否是同一个线程

  如果两个线程的id相等,则返回非零,否则返回0。

  某些实现的pthread_t不是unsigned long int类型,可能是结构体类型,无法通过“==”判断其相等性。

  4、终止线程

  1) 从线程过程函数中return。

  2) 调用pthread_exit函数。

  void pthread_exit (void* retval);

  retval和线程过程函数的返回值语义相同。

  5、线程的执行轨迹

  1) 同步方式(非分离状态):

  创建线程之后调用pthread_join函数等待其终止,并释放线程资源。

  2) 异步方式(分离状态):

  无需创建者等待,线程终止后自行释放资源。

  int pthread_detach (pthread_t thread);  

  功能:使线程进入分离(DETACHED)状态。

  返回值:成功返回0,失败返回错误码。

  处于分离状态的线程终止后自动释放线程资源,且不能被pthread_join函数等待。

  6、取消线程

  1) 向指定线程发送取消请求

  int pthread_cancel (pthread_t thread);

​  成功返回0,失败返回错误码。

​  注意:只是向线程发出取消请求,并不等待线程终止。

  缺省情况下,线程在收到取消请求以后,并不会立即终止,而是仍继续运行,直到其达到某个取消点。

  在取消点处,线程检查其自身是否已被取消了,并做出相应动作。

  当线程调用一些特定函数时,取消点会出现。

  2) 设置调用线程的可取消状态

  int pthread_setcancelstate (int state,int* oldstate);

  成功返回0,并通过oldstate参数输出原可取消状态(若非NULL),失败返回错误码。

  state取值:

  PTHREAD_CANCEL_ENABLE:接受取消请求

  PTHREAD_CANCEL_DISABLE:忽略取消请求。

  3) 设置调用线程的可取消类型

  int pthread_setcanceltype (int type, int* oldtype);

​    

  成功返回0,并通过oldtype参数输出原可取消类型(若非NULL),失败返回错误码。

​  type取值:

    PTHREAD_CANCEL_DEFERRED延迟取消(缺省)。

            被取消线程在接收到取消请求之后并不立即响应,而是一直等到执行了特定的函数(取消点)之后再响应该请求。

    PTHREAD_CANCEL_ASYNCHRONOUS - 异步取消。

         被取消线程可以在任意时间取消,不是非得遇到取消点才能被取消。

    但是操作系统并不能保证这一点。

UNIX环境--线程的更多相关文章

  1. (九) 一起学 Unix 环境高级编程 (APUE) 之 线程

    . . . . . 目录 (一) 一起学 Unix 环境高级编程 (APUE) 之 标准IO (二) 一起学 Unix 环境高级编程 (APUE) 之 文件 IO (三) 一起学 Unix 环境高级编 ...

  2. (十) 一起学 Unix 环境高级编程 (APUE) 之 线程控制

    . . . . . 目录 (一) 一起学 Unix 环境高级编程 (APUE) 之 标准IO (二) 一起学 Unix 环境高级编程 (APUE) 之 文件 IO (三) 一起学 Unix 环境高级编 ...

  3. UNIX环境高级编程——线程属性

    pthread_attr_t 的缺省属性值 属性 值 结果 scope PTHREAD_SCOPE_PROCESS 新线程与进程中的其他线程发生竞争. detachstate PTHREAD_CREA ...

  4. 【UNIX环境高级编程】线程同步

    当多个线程共享相同的内存时,需要确保每个线程看到一致的数据视图.如果每个线程使用的变量都是其他线程不会读取和修改的,那么就不存在一致性问题.同样,如果变量是只读的也不会有一致性问题.但是,当一个线程可 ...

  5. (十三) [终篇] 一起学 Unix 环境高级编程 (APUE) 之 网络 IPC:套接字

    . . . . . 目录 (一) 一起学 Unix 环境高级编程 (APUE) 之 标准IO (二) 一起学 Unix 环境高级编程 (APUE) 之 文件 IO (三) 一起学 Unix 环境高级编 ...

  6. (一) 一起学 Unix 环境高级编程 (APUE) 之 标准IO

    . . . . . 目录 (一) 一起学 Unix 环境高级编程 (APUE) 之 标准IO (二) 一起学 Unix 环境高级编程 (APUE) 之 文件 IO (三) 一起学 Unix 环境高级编 ...

  7. (二) 一起学 Unix 环境高级编程 (APUE) 之 文件 IO

    . . . . . 目录 (一) 一起学 Unix 环境高级编程 (APUE) 之 标准IO (二) 一起学 Unix 环境高级编程 (APUE) 之 文件 IO (三) 一起学 Unix 环境高级编 ...

  8. (三) 一起学 Unix 环境高级编程 (APUE) 之 文件和目录

    . . . . . 目录 (一) 一起学 Unix 环境高级编程 (APUE) 之 标准IO (二) 一起学 Unix 环境高级编程 (APUE) 之 文件 IO (三) 一起学 Unix 环境高级编 ...

  9. (四) 一起学 Unix 环境高级编程(APUE) 之 系统数据文件和信息

    . . . . . 目录 (一) 一起学 Unix 环境高级编程 (APUE) 之 标准IO (二) 一起学 Unix 环境高级编程 (APUE) 之 文件 IO (三) 一起学 Unix 环境高级编 ...

随机推荐

  1. yum源迁移(思路具体操作之后加)

    准备工作,有一台能联网的机器装有liunx系统 首先在联网机器下载yum系列包(yum命令如果不存在的话只能通过安装包的形式进行安装这里不考虑yum命令不存在情况) 修改配置文件使得yum命令只下载不 ...

  2. 微信小程序request请求封装,验签

    1/ 公共文件util添加 request请求 //简单封装请求 function request(params, path, isShowLoading = true, goBack = false ...

  3. 关于Docx动态控制word模板文件的数据

    博客:https://www.cnblogs.com/24klr/ github: https://github.com/luoruiemail/Dynamic_Word_Web 参考资料:https ...

  4. mv 命令 移动或重命名文件

    mv 命令 移动或重命名文件 [root@localhost soft]# .txt [root@localhost soft]# [root@localhost soft]# ls .txt [ro ...

  5. POJ2387 Til the Cows Come Home (最短路 dijkstra)

    AC代码 POJ2387 Til the Cows Come Home Bessie is out in the field and wants to get back to the barn to ...

  6. Codeforces 1156F Card Bag(概率DP)

    设dp[i][j]表示选到了第i张牌,牌号在j之前包括j的概率,cnt[i]表示有i张牌,inv[i]表示i在mod下的逆元,那我们可以考虑转移,dp[i][j]=dp[i-1][j-1]*cnt[j ...

  7. emmet语法列表

    emmet语法  来源:https://docs.emmet.io/cheat-sheet/ Child: > nav>ul>li <nav> <ul> &l ...

  8. Git 设置 用户名 和 邮箱

    git config --global user.name "Vincent" git config --global user.email "********@qq.c ...

  9. rpmdb: Thread/process 10646/3086534416 failed: Thread died in Berkeley DB library

    明明用rpm查看包存在,但删除的时候进程就停住了.后来出现以下错误:rpmdb: Thread/process 10646/3086534416 failed: Thread died in Berk ...

  10. Java学习02-web.xml配置详解

    <?xml version="1.0" encoding="UTF-8"?> <web-app xmlns:xsi="http:// ...