• 同步

两个或两个以上随时间变化的量在变化过程中保持一定的相对关系。

  • 互斥

对一组并发进程,一次只有一个进程能够访问一个给定的资源或执行一个给定的功能。
互斥技术可以用于解决诸如资源争用之类的冲突,还可以用于进程间的同步,使得它们可以合作。典型例子便是生产者/消费者模型。
  • 同步互斥的实现思路主要有两种:
  • 软件方法(这里讲的)
  • 信号量
  • 使用POSIX线程库(pthread_),来创建线程,管理线程,实现同步互斥。

  • POSIX(可移植操作系统)线程是线程的POSIX标准,定义了创建和操作线程的一套API。
  • 可用于多线程编程
  • POSIX线程库函数—介绍将会用到的

  • int pthread_create(pthread_t *thread, pthread_attr_t *attr,void *(*start_routine)(void *), void *arg);
  •作用:创建一个线程
  •参数thread:如果创建线程成功,标识本线程的唯一标识符通过本变量返回给函数调用者;
  •参数attr:调用者通过该参数描述期望创建的线程具有什么样的属性,传入NULL表示使用默认属性;
  •参数start_routine:线程的运行实体;
  •参数arg:传递给线程实体的参数;
  •返回值:0成功,非0为错误码;
 
  • int pthread_join(pthread_t th, void **thread_return);
  •作用:等待一个线程结束,以阻塞的方式等待th指定的线程结束。
  •参数th:描述等待一个线程结束,其取值为pthread_create函数第一个参数的返回值;
  •参数thread_return:被等待线程结束时的返回值,用户定义的指针,用来存储被等待线程的返回值。
 
  • Peterson算法

  • Peterson算法是一个实现互斥的并发程序设计算法
  • 临界缓冲区问题描述

有一个或者多个生产者产生某种类型的数据(记录、字符),并放置在缓冲区中;有一个消费者从缓冲区中取数据,每次取一项;系统保证避免对缓冲区的重复操作,也就是说,在任何时候只有一个代理(生产者或者消费者)可以访问缓冲区。
 
  • 生产者消费者模型(C代码)
  • //thread.c
    1 #include <stdio.h>
    #include <pthread.h>
    #define MAX 10 //需要生产的数量
    pthread_mutex_t the_mutex; //互斥锁
    pthread_cond_t condc, condp; //条件变量
    int buffer = ;//生产者、消费者使用的缓冲区 void *producer(void *ptr)
    {
    int i;
    for(i=; i<=; i++)
    {
    pthread_mutex_lock(&the_mutex); //互斥使用缓冲区
    while(buffer !=) pthread_cond_wait(&condp, &the_mutex); //阻塞等待
    printf("procucer produce item %d\n",i);
    buffer = i; //生产产品
    pthread_cond_signal(&condc);//通知消费者消费
    pthread_mutex_unlock(&the_mutex);//释放缓冲区
    } pthread_exit(); } void *consumer(void *ptr)
    { int i;
    for(i=; i<=; i++)
    {
    pthread_mutex_lock(&the_mutex);//互斥使用缓冲区
    while(buffer ==) pthread_cond_wait(&condc, &the_mutex); //阻塞等待
    printf("consumer consume item %d\n",i);
    buffer = ;//清空缓存区
    pthread_cond_signal(&condp);//通知生产者生产产品
    pthread_mutex_unlock(&the_mutex);//释放缓冲区
    }
    pthread_exit(); } int main(int argc, char *argv[])
    {
    pthread_t pro, con; pthread_mutex_init(&the_mutex, ); //创建互斥锁
    pthread_cond_init(&condc,); //初始化条件变量
    pthread_cond_init(&condp,); pthread_create(&con, , consumer, );
    pthread_create(&pro, , producer, );
    pthread_join(pro,);
    pthread_join(con,);
    pthread_cond_destroy(&condc);
    pthread_cond_destroy(&condp);
    pthread_mutex_destroy(&the_mutex);
    return ;
    }

    输出:

  • procucer produce item
    consumer consume item
    procucer produce item
    consumer consume item
    procucer produce item
    consumer consume item
    procucer produce item
    consumer consume item
    procucer produce item
    consumer consume item
    procucer produce item
    consumer consume item
    procucer produce item
    consumer consume item
    procucer produce item
    consumer consume item
    procucer produce item
    consumer consume item
    procucer produce item
    consumer consume item

    注意:

  • 在编译中要加 -lpthread参数, 如:gcc thread.c -o thread –lpthread
  • 使用到的一些函数功能介绍
  • int pthread_cond_wait(pthread_cond_t  *cond,  pthread_mutex_t   *mutex)

    作用:互斥的条件等待,阻塞线程

    参数:*cond是指向一个条件变量的指针

    *mutex则是对相关的互斥锁的指针

  • int pthread_cond_signal(pthread_cond_t *cond)

    作用:发送一个信号给另外一个正在处于阻塞等待状态的线程,使其脱离阻塞状态,继续执行

    参数:*cond是指向一个条件变量的指针

Linux同步互斥(Peterson算法,生产者消费者模型)的更多相关文章

  1. 网络编程基础----并发编程 ---守护进程----同步锁 lock-----IPC机制----生产者消费者模型

    1  守护进程: 主进程 创建 守护进程   辅助主进程的运行 设置进程的 daemon属性 p1.daemon=True 1 守护进程会在主进程代码执行结束后就终止: 2 守护进程内无法再开启子进程 ...

  2. POSIX信号量与互斥锁实现生产者消费者模型

    posix信号量 Link with -lpthread. sem_t *sem_open(const char *name, int oflag);//打开POSIX信号量 sem_t *sem_o ...

  3. python并发编程之多进程(二):互斥锁(同步锁)&进程其他属性&进程间通信(queue)&生产者消费者模型

    一,互斥锁,同步锁 进程之间数据不共享,但是共享同一套文件系统,所以访问同一个文件,或同一个打印终端,是没有问题的, 竞争带来的结果就是错乱,如何控制,就是加锁处理 part1:多个进程共享同一打印终 ...

  4. python开发进程:互斥锁(同步锁)&进程其他属性&进程间通信(queue)&生产者消费者模型

    一,互斥锁,同步锁 进程之间数据不共享,但是共享同一套文件系统,所以访问同一个文件,或同一个打印终端,是没有问题的, 竞争带来的结果就是错乱,如何控制,就是加锁处理 part1:多个进程共享同一打印终 ...

  5. 多道技术 进程 线程 协程 GIL锁 同步异步 高并发的解决方案 生产者消费者模型

    本文基本内容 多道技术 进程 线程 协程 并发 多线程 多进程 线程池 进程池 GIL锁 互斥锁 网络IO 同步 异步等 实现高并发的几种方式 协程:单线程实现并发 一 多道技术 产生背景 所有程序串 ...

  6. 4、网络并发编程--僵尸进程、孤儿进程、守护进程、互斥锁、消息队列、IPC机制、生产者消费者模型、线程理论与实操

    昨日内容回顾 操作系统发展史 1.穿孔卡片 CPU利用率极低 2.联机批处理系统 CPU效率有所提升 3.脱机批处理系统 CPU效率极大提升(现代计算机雏形) 多道技术(单核CPU) 串行:多个任务依 ...

  7. Python之路(第三十八篇) 并发编程:进程同步锁/互斥锁、信号量、事件、队列、生产者消费者模型

    一.进程锁(同步锁/互斥锁) 进程之间数据不共享,但是共享同一套文件系统,所以访问同一个文件,或同一个打印终端,是没有问题的, 而共享带来的是竞争,竞争带来的结果就是错乱,如何控制,就是加锁处理. 例 ...

  8. day34 python学习 守护进程,线程,互斥锁,信号量,生产者消费者模型,

    六 守护线程 无论是进程还是线程,都遵循:守护xxx会等待主xxx运行完毕后被销毁 需要强调的是:运行完毕并非终止运行 #1.对主进程来说,运行完毕指的是主进程代码运行完毕 #2.对主线程来说,运行完 ...

  9. [并发编程 - socketserver模块实现并发、[进程查看父子进程pid、僵尸进程、孤儿进程、守护进程、互斥锁、队列、生产者消费者模型]

    [并发编程 - socketserver模块实现并发.[进程查看父子进程pid.僵尸进程.孤儿进程.守护进程.互斥锁.队列.生产者消费者模型] socketserver模块实现并发 基于tcp的套接字 ...

随机推荐

  1. Azure 上SQL Database(PaaS)Time Zone时区问题处理(进阶篇)

    通常ISV在面对本地客户时对时间相关的处理,一般都时区信息都是不敏感的.但是现在云的世界里为了让大家把时间处理的方式统一起来,云上的服务都是以UTC时间为准的,现在如果作为一个ISV来说就算你面对的客 ...

  2. SQL复杂语句查询练习

    --复杂查询练习 -- 1 .列出所有员工的年工资,按年薪从低到高排序. SELECT (SAL+NVL(COMM,0))*12 INCOME FROM EMP ORDER BY INCOME; -- ...

  3. ElasticStack系列之十 & 生产中的问题与解决方案

    1. 由 gc 引起节点异常 问题: 因为 gc 时会使 jvm 停止工作,如果某个节点 gc 时间过长,master ping 3次(zen discovery默认 ping 失败重试 3 次)不通 ...

  4. Cloudstack介绍(一)

    云计算的出现 基本上,云计算只是一种把 IT 资源当作服务来提供的手段.几乎所有 IT 资源都可以作为云服务来提供:应用程序.计算能力.存储容量.联网.编程工具,以至于通信服务和协作工具. 云计算最早 ...

  5. 七、Kafka 用户日志上报实时统计之编码实践

    一.数据生产实现 1.配置数据生产模块 项目基础配置所包含的内容,如下所示: •项目工程的文件配置 •集群连接信息配置 •开发演示 2.实现 Flume 到 Kafka 模块 实现 Flume 到 K ...

  6. Java并发编程原理与实战二:并行&并发&多线程的理解

    1.CPU的发展趋势: 核心数目依旧会越来越多,根据摩尔定律,由于单个核心性能提升有着严重的瓶颈问题,普通的PC桌面在2018年可能回到24核心. 2.并发和并行的区别: 所有的并发处理都有排队等候, ...

  7. asp.net 练习 js 调用webservice

    using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.We ...

  8. LintCode 407: Plus One

    LintCode 407: Plus One 题目描述 给定一个非负数,表示一个数字数组,在该数的基础上+1,返回一个新的数组. 该数字按照位权大小进行排列,位权最大的数在列表的最前面. 样例 给定 ...

  9. 20155231 2016-2017-2 《Java程序设计》第8周学习总结

    20155231 2016-2017-2 <Java程序设计>第8周学习总结 教材学习内容总结 学习目标 了解NIO 会使用Channel.Buffer与NIO2 会使用日志API.国际化 ...

  10. 实验一 《网络对抗技术》逆向及Bof技术