POSⅨ thread 简称为pthread,Posix线程是一个POSⅨ标准线程.该标准定义

内部API创建和操纵线程.

编辑本段作用

线程库实行了POSIX线程标准通常称为pthreads.POSIX线程具有很好的可移植的性,使用pthread编写的代码可运行于Solaris、FreeBSD、Linux 等平台,Windows平台亦有pthread-win32可供使用。
Pthreads定义了一套 C程序语言类型、函数与常量,它以 pthread.h 头文件和一个线程库实现。[1]

编辑本段数据类型

pthread_t:线程句柄
pthread_attr_t:线程属性

编辑本段操纵函数

pthread_create():创建一个线程
pthread_exit():终止当前线程
pthread_cancel():中断另外一个线程的运行
pthread_join():阻塞当前的线程,直到另外一个线程运行结束
pthread_attr_init():初始化线程的属性
pthread_attr_setdetachstate():设置脱离状态的属性(决定这个线程在终止时是否可以被结合)
pthread_attr_getdetachstate():获取脱离状态的属性
pthread_attr_destroy():删除线程的属性
pthread_kill():向线程发送一个信号

编辑本段同步函数

用于 mutex 和条件变量
pthread_mutex_init() 初始化互斥锁
pthread_mutex_destroy() 删除互斥锁
pthread_mutex_lock():占有互斥锁(阻塞操作)
pthread_mutex_trylock():试图占有互斥锁(不阻塞操作)。即,当互斥锁空闲时,将占有该锁;否则,立即返回。
pthread_mutex_unlock(): 释放互斥锁
pthread_cond_destroy():销毁条件变量
pthread_cond_signal(): 唤醒第一个调用pthread_cond_wait()而进入睡眠的线程
pthread_cond_wait(): 等待条件变量的特殊条件发生
Thread-local storage(或者以Pthreads术语,称作线程特有数据):
pthread_key_create(): 分配用于标识进程中线程特定数据的键
pthread_setspecific(): 为指定线程特定数据键设置线程特定绑定
pthread_getspecific(): 获取调用线程的键绑定,并将该绑定存储在 value 指向的位置中
pthread_key_delete(): 销毁现有线程特定数据键

编辑本段工具函数

pthread_equal(): 对两个线程的线程标识号进行比较
pthread_detach(): 分离线程
pthread_self(): 查询线程自身线程标识号

编辑本段数据运用

函数应用背景:在单线程程序中,函数经常使用全局变量或静态变量,这是不会影响程序的正确性的,但如果多线程调用的函数使用全局变量或静态变量,则很可能引起编程错误,因为这些函数使用的全局变量和静态变量无法为不同的线程保存各自的值,而当同一进程内的不同线程几乎同时调用这样的函数时就可能会有问题发生。而解决这一问题的一种方式就是使用线程特定数据的机制。
下面我们引入一个简单程序实例,并以此作为介绍线程特定数据的案例。
线程特定数据:
static char str[100];
void A(char* s)
{
strncpy(str,s,100);
}
void B()
{
printf(“%s\n”,str);
}
可以想象,如果在多线程程序中,各个线程都依次调用函数 A 和函数 B,那么某些线程可能得不到期望的显示结果,因为它使用 B 显示的字符串可能并不是在 A 中设置的字符串。读者会发现,这两个函数非常的简单,但在本章内容中,这两个函数已经足以解释线程特定数据的含义,因为这两个函数代表了使用线程特定数据机制的一种典型场合,即有多个函数使用同一个全局变量
POSⅨ 要求实现 POSⅨ 的系统为每个进程维护一个称之为 Key 的结构数组,这个数组中的每一个结构称之为一个线程特定数据元素。POSⅨ 规定系统实现的 Key 结构数组必须包含不少于 128 个线程特定数据元素,而每个线程特定数据元素中至少包含两项内容:使用标志和析构函数指针。线程特定数据元素中的使用标志指示这个数组元素是否正在使用,初始值为“不在使用”,我们稍后讨论线程特定数据元素中的析构函数指针。在后面的介绍中,我们假设Key 结构数组中包含 128 个元素。
Key 结 构 数 组 中 每 个 元 素 的 索 引 (0~127) 称 之 为 键 (key) 当 一 个 线 程 调 用,pthread_key_create 创建一个新的线程特定数据元素时,系统搜索其所在进程的 Key 结构数组,找出其中第一个不在使用的元素,并返回该元素的键。这个函数的形式为:
int pthread_key_create(pthread_key_t *keyptr,void (* destructor)(void *value));
参数 keyptr 为一个 pthread_key_t变量指针,用于保存得到的键值。参数 destructor为指定的析构函数指针。除了 Key 结构数组,系统还在进程中维护关于每个线程的多种信息。这些特定于线程的信息被保存于称之为 Pthread 的结构中。Pthread 结构中包含名为 pkey 的指针数组,其长度为128,初始值为空。这 128 个指针与 Key 结构数组的 128 个线程特定数据元素一一对应。在调用 pthread_key_create 得到一个键之后,每个线程可以依据这个键操作自己的 pkey 指针数组中对应的指针,这通过 pthread_getspecific 和 pthread_setspecific 函数来实现。这两个函数的形式为:
void *pthread_getspecific(pthread_key_t key);
int pthread_setspecific(pthread_key_t key,const void *value);
pthread_getspecific 返回 pkey 中对应于 key 的指针,而 pthread_setspecific 将 pkey 中对应于 key 的指针设置为 value。我们使用线程特定数据机制,就是要使线程中的函数可以共享一些数据。如果我们在线程中通过 malloc 获得一块内存,并把这块内存的指针通过 pthread_setspecific 设置到 pkey指针数组中对应于 key 的位置,那么线程中调用的函数即可通过 pthread_getspecific 获得这个指针,这就实现了线程内部数据在各个函数间的共享。当一个线程终止时,系统将扫描该线程的 pkey数组,为每个非空的 pkey指针调用相应的析构函数,因此只要将执行回收的函数的指针在调用 pthread_key_create 时作为函数的参数,即可在线程终止时自动回收分配的内存区。

POSⅨ thread的更多相关文章

  1. JAVA基础学习day22--IO流四-对象序列化、管道流、RandomAccessFile、DataStream、ByteArrayStream、转换流的字符编码

    一.对象序列化 1.1.对象序列化 被操作的对象需要实现Serializable接口 1.2.对象序列化流ObjectOutputStream与ObjectInputStream ObjectInpu ...

  2. Unity3D 中 脚本(MonoBehaviour) 生命周期WaitForEndOfFrame需要注意的地方

    首先看看MonoBehaviour的生命周期 先上个图(来源 http://blog.csdn.net/qitian67/article/details/18516503): 1.Awake 和 St ...

  3. Java回顾之多线程

    在这篇文章里,我们关注多线程.多线程是一个复杂的话题,包含了很多内容,这篇文章主要关注线程的基本属性.如何创建线程.线程的状态切换以及线程通信,我们把线程同步的话题留到下一篇文章中. 线程是操作系统运 ...

  4. 黑马程序猿——25,打印流,合并流,对象序列化,管道流,RandomAccessFile

    ------<ahref="http://www.itheima.com" target="blank">Java培训.Android培训.iOS培 ...

  5. 【转】C#使用ESC指令控制POS打印机打印小票

    .前言 C#打印小票可以与普通打印机一样,调用PrintDocument实现.也可以发送标注你的ESC指令实现.由于 调用PrintDocument类时,无法操作使用串口或TCP/IP接口连接的pos ...

  6. socket实现手机连接网络打印机打印pos单

    打印的工具类: public class PrintLine {  String TAG = "xxl";  static String PRINT_IP = "192. ...

  7. C#使用ESC指令控制POS打印机打印小票

    1.前言 C#打印小票可以与普通打印机一样,调用PrintDocument实现.也可以发送标注你的ESC指令实现.由于 调用PrintDocument类时,无法操作使用串口或TCP/IP接口连接的po ...

  8. mutex,thread

    //#include <stdio.h> //#include <stdlib.h> //#include <unistd.h> #include <wind ...

  9. Python实现一条基于POS算法的区块链

    区块链中的共识算法 在比特币公链架构解析中,就曾提到过为了实现去中介化的设计,比特币设计了一套共识协议,并通过此协议来保证系统的稳定性和防攻击性. 并且我们知道,截止目前使用最广泛,也是最被大家接受的 ...

随机推荐

  1. PL/SQL Developer基本用法

    一.新建存储过程

  2. Overview Of Portal Registry And Content References

     Portal Registry Each portal is defined by a portal registry.A portal registry has a tree-like struc ...

  3. ASP.NET的学习之asp.net整体运行机制

    1.浏览器向服务器发送请求报文,服务器端的软件比如是IIS,接受请求 2.IIS通过aspnet_isapi.dll 这个程序集来请求FrameWork中的ASP.Net框架,这是对于集成模式 3.进 ...

  4. jQuery类级别插件--返回顶部,底部,去到任何部位

    先引入js:<script type="text/javascript" src="jquery.js" ></script><s ...

  5. 神奇的fastcgi_finish_request

    当PHP运行在FastCGI模式时,PHP FPM提供了一个名为fastcgi_finish_request的方法.按照文档上的说法,此方法可以提高请求的处理速度,如果有些处理可以在页面生成完后再进行 ...

  6. slidingmenu

        slidingmenu是一个开源组件.提供了左滑菜单和右滑菜单.下面是一个使用例子的工程源码.     在项目中不去管源码仅仅只是使用的话,主要需要实现的有3个类 MainActivity:这 ...

  7. 【转】利用DCC32实现命令行批量编译

    *.dof [Compiler] A=1 B=0 C=1 D=1 E=0 F=0 G=1 H=1 I=1 J=1 K=0 L=1 M=0 N=1 O=1 P=1 Q=0 R=0 S=0 T=0 U=0 ...

  8. ARM时钟初始化

    2440: S3C2440可以使用外部晶振(XTIpll)(默认为12MHZ)和外部时钟(EXTCLK)两种方式输入时钟信号.它由跳线OM[3:2]决定.S3C2440 默认的工作主频为12MHz(晶 ...

  9. Python初学者笔记(4)-简单的通讯录

    要求: 编写一个简单的通讯录 1.通讯录包含至少包含姓名.电话号码.电子邮箱:2.通讯录的信息能够保存在本地磁盘:3.通讯录查找特定人员的信息:4.通讯录能够修改特定人员的信息:5.通讯录能够删除特定 ...

  10. WPF工作笔记:本地化支持、主进程通知、两种最常用异步编程方式

    1.本地化支持 (1)重写控件默认的依赖属性LanguageProperty FrameworkElement.LanguageProperty.OverrideMetadata( typeof(Fr ...