线程同步机制:http://www.cnblogs.com/zheng39562/p/4270019.html

一、基础知识

1:基础知识。

  1,线程需要的信息有:线程ID,寄存器,栈,调度优先级和策略,信号屏蔽字,errno变量和线程私有数据。

  2,进程的所有信息对所有线程都是共享的。

  3,是否支持有多线程有以下两种方式测试:

    1)编译时确定:#ifdef _POSIX_THREADS

    2)运行时确定:sysconf函数调用 _SC_THREADS 常用。

  4,线程ID。

    1)一个进程中,线程ID具有唯一性。线程ID依赖与进程后,才有意义。

    2)线程ID表示类型:pthread_t类型

  5,变量增量操作的步骤:

    1)变量值从 内存单元 读入 寄存器。

    2)寄存器中对变量进行修改。

    3)将变量值 写回 内存单元

    4)所以,多个线程试图同时修改同一变量时,需要同步。

  6,进程资源和线程的关系:

    1)每个线程都有自己的信号屏蔽字。但,信号处理是所有线程共享的。所以,线程对信号的处理会影响所有线程。

    2)闹钟定时是进程资源。所有线程共享使用。

    3)pread / pwrite 函数在多线程读写比较适用。因为其可以保存多个线程的读写偏移量,从而保证不会被覆盖。

2:线程创建和终止。

  1,线程创建。

    1)并不能确定哪个线程先运行(和子进程创建类似)。

    2)创建函数create失败后,通常会返回错误码。

  2,线程终止。

    1)任意线程调用 exit, _Exit, _exit函数都会使进程终止。(所以不可以使用此方式终止单个线程)

    2)从启动例程返回。返回值时线程退出码。

    3)可以被同进程中的其他线程取消。

    4)线程调用pthread_exit函数。

3:线程的数据和安全

  1,线程安全:一个函数在相同时间点可以被多个线程安全地调用。

    1)当一个函数是可重入时,那就是线程安全的。

    2)异步信号安全。

  2,可重入函数。

    1)当处理信号中断时,部分函数可能更改信息,导致中断处理结束后,无法正确的从中断点继续执行程序(信息错位)。

    2)可重入函数保证再中断期间调用这些函数,不会导致信息错位。

    3)可重入函数又被称为异步信号安全的函数。

  3,线程私有数据:具体操作见函数。

5:进程和线程功能/函数对应表

进程原语 线程原语 描述

fork

pthread_create 创建新的控制流
exit pthread_exit 从先有控制流中退出
waitpid pthread_join 从控制流中得到退出状态
atexit pthread_cancel_push 注册在退出控制流时的调用的函数
getpid pthread_self 获取控制流的ID
abort pthread_cancel 请求控制流的非正常退出。

二、相关函数。

1:线程操作函数。

  1. 比较线程ID大小。
  2.   int pthread_equal( pthread_t tid1, pthread_t tid2 )
  3. 获取自身线程ID
  4.   pthread_t pthread_self( void );
  5. 创建线程。
  6.   int pthread_create( pthread_t *restrict tidp, const pthread_attr_t *restrict attr, void *(*start_rtn)(void *), void *restrict arg);
  7.   // 1 参数arg用于定制各种不同的线程属性
  8. 线程终止。   
  9.   void pthread_exit( void *rval_ptr );
  10. 获得线程退出状态。   
  11.   int pthread_join( pthread_t thread, void **rval_ptr );   
  12.   // 1 参数rval_ptr包含返回码。
  13. 取消其他线程(同进程中使用)   
  14.   int pthread_cancel( pthread_t tid );   
  15.   // 1 仅仅提出请求。并不强制终止。
  16. 线程清理处理程序(类似进程的atexit)。   
  17.   void pthread_cleanup_push( void (*rtn)(void *), void *arg);   
  18.   void pthread_cleanup_pop( int execute );   
  19.   // 1 参数execute=0时,清理函数将不被调用。   
  20.   // 2 每次调用pop函数时,都出删除上一个push的清理程序。   
  21.   // 3 这些函数被实现为宏。需要注意{}等匹配。   
  22.   // 4 清理程序的注册和执行顺序相反。
  23. 分离线程。   
  24.   int pthread_detach( pthread_t tid );
  25. 清除子进程的锁
  26.   int pthread_atfork( void (*prepare)(void), void (*parent)(void), void (*child)(void) );   
  27.   // 1 注册和执行顺序相反。
  28. 上述函数中。部分无类型指针,可以传递的值有很多,甚至可以时一个结构体。

2,线程属性 相关函数。

  1. 线程属性 初始化 类析构函数
  2.   int pthread_attr_init pthread_attr_t *attr );
  3.   int pthread_attr_destroy( pthread_attr_t *attr );
  4. 获取/设置 分离状态。
  5.   int pthread_attr_getdetachstats( const pthread_attr_t *restrict attr, int *detachstate );
  6.   int pthread_attr_setdetachstats( pthread_attr_t *attr, int *detachstate );
  7.   // 1 参数detachstate只有两个值:PTHREAD_CREATE_ DETACHED/JOINABLE.
  8. 获取/设置 线程栈属性 stackaddr
  9.   int pthread_attr_getstack( const pthread_attr_t *restrict attr, void **restrict stackaddr, size_t *restrict stacksize );
  10.   int pthread_attr_setstack( pthread_attr_t *attr, void *stackaddr, size_t stacksize );
  11.   // 1 stackaddr线程属性定义为栈的最低内存地址。是起始位置,还是结尾位置取决于栈的发展方向。通常是结尾(栈由高向低)
  12. 获取/设置 栈大小属性 stacksize
  13.   int pthread_attr_getstacksize( const pthread_attr_t *restrict attr, size_t *restrict stacksize );
  14.   int pthread_attr_setstacksize( pthread_attr_t *attr, size_t stacksize );
  15. 获取/设置 线程栈末尾缓冲区大小 guardsize
  16.   int pthread_attr_getguardsize( const pthread_attr_t *restrict attr, size_t *restrict guardsize );
  17.   int pthread_attr_setguardsize( pthread_attr_t *attr, size_t guardsize );

3:线程私有数据。

  1. 创建一个键
  2.   int pthread_key_create( pthread_key_t *keyp, void (*destructor)(void *));
  3.   // 1 可以指定一个析构函数(第二个参数)
  4.   // 2 每个线程的键的独立的:即相同的KEY在不同线程中表示不同的数据。
  5. 取消一个键和特定线程的关联。
  6.   int pthread_key_delete( pthread_key_t key );
  7.   // 1 不激活关联的析构函数。
  8. 使一个键只被调用一次:使不同线程拥有不同的键。
  9.   int pthread_once( pthread_once_t *initflag, void (*initfn)(void));
  10. 获取/设置 键内数据。
  11.   void *pthread_getspecific( pthread_key_t key );
  12.   int pthread_setspecific( pthread_key_t key , const void *value );

4:特殊线程属性:可取消状态 和 可取消类型。

  1. 设置 可取消状态
  2.   int pthread_setcancelstate( int state, int *oldstate );
  3.   // 1 取消状态有两种: PTHREAD_CANCEL_ ENABLE/DISABLE
  4. 设置 自己的取消点。
  5.   void pthread_testcancel( void );
  6.   // 1 取消状态作用:取消请求发出后,会在下一个取消点进行取消操作(个人理解退出线程)。
  7. 修改取消类型。
  8.   int pthread_setcanceltype( int type, int *oldtype )

5:线程和信号

  1. 线程阻止信号发送
  2.   int pthread_sigmask( int how, const sigset_t *restrict set, sigset_t *restrict oset );
  3. 等待信号。
  4.   int sigwait( const sigset_t *restrict set, int *restrict signop );
  5.   // 1 参数set指定线程等待的信号集。
  6.   // 2 参数signop 包含发送信号的数量。
  7.   // 3 在使用函数前,必须先阻塞它等待的信号。(参数一)
  8.   // 4 函数在执行时,会取消信号集的阻塞状态。
  9. 发送信号给线程。
  10.   int pthread_kill( pthread_t thread, int signo );
  11.   // 1 参数signo传递0,可以检查线程是否存在

三、

linux学习笔记之线程的更多相关文章

  1. Linux学习笔记22——线程属性(转)

    本文来自博客园:http://www.cnblogs.com/yc_sunniwell/archive/2010/06/24/1764204.html 一.线程属性线程具有属性,用pthread_at ...

  2. Linux学习笔记21——线程同步的两种方式

    一  用信号量同步 1 信号量函数的名字都以sem_开头,线程中使用的基本信号量函数有4个 2 创建信号量 #include<semaphore.h> int sem_init(sem_t ...

  3. linux学习笔记之线程同步机制

    一.基础知识. 1:线程同步机制:互斥量,读写锁,条件变量,自旋锁,屏障. 1,互斥量:每个进程访问被互斥量保护的资源时,都需要先对互斥量进行判断. 1)互斥量重要属性:进程共享属性,健壮属性,类型属 ...

  4. 操作系统学习笔记----进程/线程模型----Coursera课程笔记

    操作系统学习笔记----进程/线程模型----Coursera课程笔记 进程/线程模型 0. 概述 0.1 进程模型 多道程序设计 进程的概念.进程控制块 进程状态及转换.进程队列 进程控制----进 ...

  5. Linux 学习笔记

    Linux学习笔记 请切换web视图查看,表格比较大,方法:视图>>web板式视图 博客园不能粘贴图片吗 http://wenku.baidu.com/view/bda1c3067fd53 ...

  6. linux学习笔记2-linux的常用命令

    第一篇博客:linux学习笔记1-ubuntu的安装与基本设置 之中,已经介绍了如何安装linux操作系统,以及一些基本的设置修改. 本篇博客主要介绍linux中的一些常用的终端命令 ======== ...

  7. Linux学习笔记(一)2015.4.13

    研究生由单片机转Linux学习 首先安装VMware虚拟机,用的是VMware 10.0 在VMware 10.0上安装视频上推荐的Red Hat Linux 5 安装后正式进入Linux学习 笔记1 ...

  8. 20160127 linux 学习笔记

    Linux学习笔记第一天 Linux基本介绍 Linux的起源和发展: 简单说linux是一种操作系统,可以安装在包括服务器.个人电脑,乃至PDA.手机.打印机等各类设备中. 起源: Linux起源于 ...

  9. linux —— 学习笔记(汇总)

    笔记目录:一.系统知识 和 基本概念                    二.常用操作                   三.系统管理(内存.设备.服务等管理)                   ...

随机推荐

  1. CMarkUp读写XML(转)

    Fast start to XML in C++ Enough bull. You want to create XML or read and find things in XML. All you ...

  2. vim常用指令一览

    插入指令 i 在光标处插入字符 I 在光标所在行最前插入 a 在光标所在字符后面插入 A 在光标所在行的最后插入 o 在光表所在行下面插入一行 O 在光标所在行上面插入一行 r 替换光标所在字符,只替 ...

  3. Wordpress更换主题之后出错

    今天吃完午饭,休息休息,最近搞了一下google adsense,不过最终的审核没通过,我想会不会是界面不好看呢,饭后就在电脑旁,更换了几个wordpress主题,我的博客使用wordpress搭建的 ...

  4. [ofbiz]service中OUT的定义

    在service中返回的任何一个结果,比如map1,map2,然后这两个map又封装在另一个map中,则service的定义中,要将map1和map2定义为OUT类型 LOFTER:我们的故事   h ...

  5. JDK,TomCat安装配置

    JDK.Tomcat.myEclipse安装配置 准备安装包 JAVA运行环境包 JDK1.7下载地址: http://www.veryhuo.com/down/html/43205.html Jsp ...

  6. 看看国外的javascript题目,你能全部做对吗?(分享)

    本文转自@Aaron的博客,拿过来分享一下.原文:看看国外的javascript题目,你能全部做对吗? 题目一: (function(){ return typeof arguments; })(); ...

  7. ZendFramework2 源码分析 index.php

    <?php /** * This makes our life easier when dealing with paths. Everything is relative * to the a ...

  8. 【3】python核心编程 第六章-序列:字符串、列表和元组

    1.序列类型操作符 序列操作符 作用 seq[ind] 获得下标为ind 的元素 seq[ind1:ind2] 获得下标从ind1 到ind2 间的元素集合 seq * expr 序列重复expr 次 ...

  9. 一个简单的网页读字符串 SpeechLib

    //引用组件:Interop.SpeechLib.dll//导入空间:SpeechLib //引用组件:Interop.SpeechLib.dll//导入空间:SpeechLib 前面设置内容引用别人 ...

  10. Spring boot 提高篇

    Spring boot 提高篇 上篇文章介绍了Spring boot初级教程:构建微服务:Spring boot 入门篇,方便大家快速入门.了解实践Spring boot特性:本篇文章接着上篇内容继续 ...