Linux同步互斥(Peterson算法,生产者消费者模型)
同步
两个或两个以上随时间变化的量在变化过程中保持一定的相对关系。
互斥
- 同步互斥的实现思路主要有两种:
 - 软件方法(这里讲的)
 - 信号量
 
使用POSIX线程库(pthread_),来创建线程,管理线程,实现同步互斥。
- POSIX(可移植操作系统)线程是线程的POSIX标准,定义了创建和操作线程的一套API。
 - 可用于多线程编程
 
POSIX线程库函数—介绍将会用到的
- int pthread_create(pthread_t *thread, pthread_attr_t *attr,void *(*start_routine)(void *), void *arg);
 
- int pthread_join(pthread_t th, void **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算法,生产者消费者模型)的更多相关文章
- 网络编程基础----并发编程 ---守护进程----同步锁 lock-----IPC机制----生产者消费者模型
		
1 守护进程: 主进程 创建 守护进程 辅助主进程的运行 设置进程的 daemon属性 p1.daemon=True 1 守护进程会在主进程代码执行结束后就终止: 2 守护进程内无法再开启子进程 ...
 - POSIX信号量与互斥锁实现生产者消费者模型
		
posix信号量 Link with -lpthread. sem_t *sem_open(const char *name, int oflag);//打开POSIX信号量 sem_t *sem_o ...
 - python并发编程之多进程(二):互斥锁(同步锁)&进程其他属性&进程间通信(queue)&生产者消费者模型
		
一,互斥锁,同步锁 进程之间数据不共享,但是共享同一套文件系统,所以访问同一个文件,或同一个打印终端,是没有问题的, 竞争带来的结果就是错乱,如何控制,就是加锁处理 part1:多个进程共享同一打印终 ...
 - python开发进程:互斥锁(同步锁)&进程其他属性&进程间通信(queue)&生产者消费者模型
		
一,互斥锁,同步锁 进程之间数据不共享,但是共享同一套文件系统,所以访问同一个文件,或同一个打印终端,是没有问题的, 竞争带来的结果就是错乱,如何控制,就是加锁处理 part1:多个进程共享同一打印终 ...
 - 多道技术 进程  线程 协程  GIL锁   同步异步  高并发的解决方案   生产者消费者模型
		
本文基本内容 多道技术 进程 线程 协程 并发 多线程 多进程 线程池 进程池 GIL锁 互斥锁 网络IO 同步 异步等 实现高并发的几种方式 协程:单线程实现并发 一 多道技术 产生背景 所有程序串 ...
 - 4、网络并发编程--僵尸进程、孤儿进程、守护进程、互斥锁、消息队列、IPC机制、生产者消费者模型、线程理论与实操
		
昨日内容回顾 操作系统发展史 1.穿孔卡片 CPU利用率极低 2.联机批处理系统 CPU效率有所提升 3.脱机批处理系统 CPU效率极大提升(现代计算机雏形) 多道技术(单核CPU) 串行:多个任务依 ...
 - Python之路(第三十八篇) 并发编程:进程同步锁/互斥锁、信号量、事件、队列、生产者消费者模型
		
一.进程锁(同步锁/互斥锁) 进程之间数据不共享,但是共享同一套文件系统,所以访问同一个文件,或同一个打印终端,是没有问题的, 而共享带来的是竞争,竞争带来的结果就是错乱,如何控制,就是加锁处理. 例 ...
 - day34 python学习  守护进程,线程,互斥锁,信号量,生产者消费者模型,
		
六 守护线程 无论是进程还是线程,都遵循:守护xxx会等待主xxx运行完毕后被销毁 需要强调的是:运行完毕并非终止运行 #1.对主进程来说,运行完毕指的是主进程代码运行完毕 #2.对主线程来说,运行完 ...
 - [并发编程 - socketserver模块实现并发、[进程查看父子进程pid、僵尸进程、孤儿进程、守护进程、互斥锁、队列、生产者消费者模型]
		
[并发编程 - socketserver模块实现并发.[进程查看父子进程pid.僵尸进程.孤儿进程.守护进程.互斥锁.队列.生产者消费者模型] socketserver模块实现并发 基于tcp的套接字 ...
 
随机推荐
- servlet的application对象的使用
			
application对象 1 什么是application对象 ? (1) 当Web服务器启动时,Web服务器会自动创建一个application对象.application对象一旦创建,它将一直存 ...
 - GCC、GNU C、C99、ANSI C
			
ANSI C ANSI C是由美国国家标准协会(ANSI)及国际标准化组织(ISO)推出的关于C语言的标准.ANSI C 标准同时规定了 C 标准库. ANSI C发展历史 C 的第一个标准是由ANS ...
 - python的map函数的使用方法详解以及使用案例(处理每个元素的自增、自减、平方等)
			
1.用我们之前学过的求一下平方(只有一个列表) #求平方 num=[1,5,6,2,7,8] a=[] for n in num: a.append(n**2) print (a) C:\python ...
 - python---基础知识回顾(五)(python2.7和python3.5中的编码)
			
Unicode 和 UTF-8 有何区别? python基础之字符编码 以上两篇看懂即可,那下面的就不需要看了 python标准数据类型 Bytes python--数据类型bytes Python ...
 - Redis slowlog慢查询
			
slowlog (阅读原文) 此命令用于读取和重置redis慢请求日志 redis slow log概述 redis的slow log记录了那些执行时间超过规定时长的请求.执行时间不包括I/O操作(比 ...
 - tomcat 性能检测
			
一.jconsole 1.tomcat在windows上,start方式启动 在catalina.bat 文件中的:doRun和:doStart下添加以下代码 (没有换行) set JAVA_OPTS ...
 - 【官方文档】Nginx负载均衡学习笔记(三) TCP和UDP负载平衡官方参考文档
			
本章介绍如何使用NGINX Plus和NGINX开放源代理和负载平衡TCP和UDP流量. 目录 介绍 先决条件 配置反向代理 配置TCP或UDP负载平衡被动健康监控 选择负载平衡方法 配置会话持久性 ...
 - Spring MVC表单防重复提交
			
利用Spring MVC的过滤器及token传递验证来实现表单防重复提交. 创建注解 @Target(ElementType.METHOD) @Retention(RetentionPolicy.RU ...
 - js 替换部分内容为星号
			
function formatPhone(phone) { return phone.replace(/(\d{3})\d{4}(\d{4})/, "$1****$2"); } 姓 ...
 - 【转】WPF绑定模式
			
源地址:http://www.cnblogs.com/zjz008/archive/2010/05/26/1744802.html http://blog.csdn.net/haylhf/articl ...