当线程运行在同样的线程空间,线程们共享同样的内存和资源。这使它变得很容易对于线程来通信和共享数据,尽管它会发生两种问题:线程阻塞和内存不一致由于线程的同步对共享资源的修改。在这些情况下,线程同步变得很重要。线程同步提供了这机制来确保同步运行的线程并不执行同一块代码在同一时间。与Java线程类似,这POSIX Thread API也提供同步的函数。这章主要讲述两种有POSIX Threads提供的同步机制:

Mutexes(互斥信号量)被包含在同一代码中并不能在同一时间执行。

Semaphores(资源信号量)通过指定的资源数量来控制获得资源。如果没有资源,这调用线程等待资源被释放后执行。

使用互斥信号量的同步线程:

POSIX Thread API通过pthread_mutex_t数据类型来展示互斥信号量给原生代码。这

POSIX Thread API提供了一套函数来和互斥信号量通信。使用之前,这互斥信号量应该被先初始化。

初始化信号量:

这POSIX Thread API提供两种方式初始化信号量:pthead_mutex_init函数和PTHREAD_MUTEX_INITIALIZER宏。这pthread_mutex_init函数能够被用来初始化这个信号量。

int pthread_mutex_init(pthread_mutex_t* mutex,const pthread_mutexattr_t* attr);

这个pthread_mutex_init函数的两个参数,一个互斥信号量的指针来初始化和一个phread_mutexattr_t结构定义这互斥信号量的指针。如果第二个参数被设置为NULL,这默认的属性被使用。如果这默认属性时足够,代替者pthread_mutex_init函数,这PTHREAD_MUTEX_INITIALIZER宏是最恰当的。

pthread_mutex_t mutex=PTHREAD_MUTEX_INITALIZER;

基于成功的初始化,这互斥信号量的状态变得被初始和unlocked,和这函数返回0,否则它将返回这错误代码。

锁定互斥信号量

这pthread_mutex_lock函数被用来获得共同的代码通过锁定已经初始化的信号量。

int pthread_mutex_lock(pthread_mutex_t* mutex);

这个函数的参数是这互斥信号量的指针。如果这互斥信号量已经被锁定了,这调用先被阻止直到互斥信号量被解锁。成功的情况下,返回0;否则它返回这错误代码。

解锁信号量

基于完成执行这严格的代码区间,这互斥信号能够解锁使用pthread_mutex_unlock函数。

int pthread_mutex_unlock(pthread_mutex_t* mutex);

成功执行时返回0;否则返回错误代码。

pthread_mutex_destroy销毁互斥信号量。

使用资源信号量同步POSIX Threads:

并不像其他的POSIX函数,这个POSIX资源信号量被定义在一个不同的头文件,这semaphore.h中。

#include<semaphore.h>

这POSXI资源信号量通过sem_t 数据类型被展示给原生代码。这POSIX 资源信号量API提供了一套函数对于来自原生代码的资源信号量相互制约。使用之前,这资源信号量必须先被初始化。

初始化资源信号量:

这POSIX资源信号量API同sem_init函数来初始化这资源信号量。

extern int sem_init(sem_t* sem,int pshared,unsigned int value);

他的三个参数:一个资源信号量的指针被初始化,这共享的标记和它初始化的值。一旦成功返回0,否则返回-1;

锁定资源信号量

一旦这资源信号量被恰当初始化,线程能够实用sem_wait函数来减少这信号量的数量:

extern int sem_wait(sem_t* sem);

这函数信号量的指针为参数。如果资源信号量的值是大于0的,这锁定成功和这信号量的值就会减少。如果这信号量的值为0,调用线程就会阻止直到这资源信号里通过unlocking来增加。一旦成功,这函数返回0;否则返回-1;

解锁资源信号量

一旦完成这执行关键代码区,这线程能偶解锁资源信号量通过这sem_post函数。

extern int sem_post(sem_t* sem);

当这资源信号量被解锁通过sem_post函数,它的值增加1.调度策略决定那个线程得到执行。一旦成功返回0,否则返回-1;

销毁资源信号量:

一旦这资源信号量不在被需要,它可以被销毁通过这sem_destroy函数。

extern int sem_destroy(sem_t* sem);

这函数去资源信号量的指针作为参数。销毁一个资源信号量其他的线程可能被阻塞可能导致不确定的行为。一旦函数返回0,成功。否则-1.

对于POSIX线程优先级和调度策略:

调度策略,和线程优先级,以一个可能执行的顺序的对线程列表排序。这部分简要的浏览这些调度策略和这线程的优先级。

Posix线程的调度策略:

这POSIX线程指定需要一套调度策略来实现。这最流行使用的策略如下:

SCHED_FIFO:先进先出的调度策略。

SCHED_RR:这round_robin调度策略防止独占CPU资源,循环执行。

他们在sched.h头文件中。这调度策略sched_policy域pthread_attr_t中指定在pthread_create函数中或通过这个函数的运行期间。

int poilcy;

struct sched_param const* param);

PoSix 线程的优先级:

这POSIX Thread API也提供函数来矫正基于调度策略的线程优先级。这线程的优先级被定义使用sched_priority域通过pthread_attr_t结构来使用pthread_create函数时,或者通过pthread_setschedparam函数在运行期间和提供优先级在sched_param结构。则最小和最大的优先级值基于调度策略是不同的。这应用程序能够查询这些数字通过使用sched_get_priority_max和sched_get_priority_min函数。

POSIX线程的同步相关推荐

  1. linux进程线程同步之 - POSIX线程互斥锁

    POSIX线程互斥锁 使用范围:线程同步 本文转自:http://blog.csdn.net/jiebaoabcabc/article/details/37914769 一.函数介绍 1.初始化互斥锁 ...

  2. POSIX 线程编程(二)线程建立与终止

    创建与终止线程 线程的管理常用的API有: pthread_create(thread,attr,start_routine,arg) pthread_exit(status) pthread_can ...

  3. linux posix 线程池_linux多线程--POSIX Threads Programming

    linux多线程自己从接触很久也有不少实践,但总是觉得理解不够深刻,不够系统.借这篇文章试着再次系统学习一下linux多线程编程,理解编程的concept,细致看一下POSIX pthread API ...

  4. linux网络编程之posix 线程(四):posix 条件变量与互斥锁 示例生产者--消费者问题

    http://blog.csdn.net/jnu_simba/article/details/9129939 一.posix 条件变量 一种线程间同步的情形:线程A需要等某个条件成立才能继续往下执行, ...

  5. linux网络编程之posix 线程(三):posix 匿名信号量与互斥锁 示例生产者--消费者问题

    http://blog.csdn.net/jnu_simba/article/details/9123603 一.posix 信号量 信号量的概念参见这里.前面也讲过system v 信号量,现在来说 ...

  6. Posix线程编程指南(4) 线程终止

    线程终止方式 一般来说,Posix的线程终止有两种情况:正常终止和非正常终止.线程主动调用pthread_exit()或者从线程函数中return都将使线程正常退出,这是可预见的退出方式:非正常终止是 ...

  7. POSIX 线程详解

    一种支持内存共享的简捷工具 简介: POSIX(可移植操作系统接口)线程是提高代码响应和性能的有力手段.在本系列中,Daniel Robbins 向您精确地展示在编程中如何使用线程.其中还涉及大量幕后 ...

  8. posix线程使用详解

     原文:http://blog.csdn.net/liuhongxiangm/article/details/8308697 Posix多线程编程学习笔记(一)-线程基础(1) 一.什么是线程   ...

  9. IOT-OS之RT-Thread(六)--- 线程间同步与线程间通信

    文章目录 一.IPC对象管理 1.1 IPC对象控制块 1.2 IPC对象接口函数 二.线程间同步对象管理 2.1 信号量对象管理 2.2 互斥量对象管理 2.3 事件集对象管理 三.线程间通信对象管 ...

最新文章

  1. Python 图像处理简介——色彩阴影调整
  2. C# 的关键字系列 (3 of n)
  3. [网络安全自学篇] 二十七.Sqlmap基础知识、CTF实战及请求参数设置(一)
  4. 深入理解 KVC\KVO 实现机制 — KVC
  5. uva 12442 . Forwarding Emails
  6. Java学习笔记13-1——SpringMVC
  7. OpenCV-Python实战(10)——详解 OpenCV 轮廓检测
  8. iOS cocoapods的使用规范说明及示例(.podspec配置文件)
  9. 只允许,同一域名下IFRAME,禁止直接访问页面
  10. 知道域名差服务器系统,对DNS域名系统的抓包分析
  11. DoIP诊断概念入门
  12. 使用MAKER进行全基因组基因注释-基础篇
  13. html制作带有尖角的边框,纯CSS3制作带尖角的气泡对话框实例特效代码
  14. 还不知道什么是cms 什么是 cmf?
  15. 物联网RFID技术之应用ETC系统
  16. 3D深度传感ToF技术的基本原理解析
  17. 西电 计算机学院 博后流动站,西电7个博士后科研流动站接受专家组综合评估检查...
  18. 【Python】socket编程——使用UDP协议打造在线时间服务器
  19. 投资的N种认偏差总有款打败你
  20. 磁盘分区工具diskgenius、易我分区大师

热门文章

  1. [基础题] 7.第二种(*)按如下要求编写Java程序:
  2. [渗透攻防] 四.详解MySQL数据库攻防及Fiddler神器分析数据包
  3. Python执行脚本文件将输出既能显示控制台又能重定向到日志
  4. 2010年第一届蓝桥杯省赛 —— 第一题
  5. 【C/C++10】天气APP:MySQL/PostgreSQL,环境变量/动静态库,Linux/Oracle字符集
  6. 【Qt】数据库实战(二)
  7. 【linux系统编程】进程间通信:信号中断处理
  8. 如何制作印章_电子公章怎么制作
  9. 《汇编语言(第三版)》pushf 和 popf 指令,以及标志寄存器在 Debug 中的表示
  10. html(2)标签(1)