线程间通信————同步
同步
是指多个任务按照约定的先后次序 相互配合完成一件事情
信号量:
由信号量决定 线程是继续执行 还是阻塞等待
信号量代表某种资源 其值表示系统中该资源的数量
信号量是一个受保护的量 只能通过特定的三种操作来访问
初始化
P操作(申请资源, 有可能阻塞)
V操作(释放资源, 不会阻塞)
P(s)操作 :
if(信号量的值大于0 )
申请资源的任务继续执行 信号量-1
else
申请资源的任务阻塞·
V(s)操作 :
信号量+1
if(有任务在等待资源 )
唤醒等待任务 让其继续执行
Posix信号量
内部定义了两类信号量:
无名信号量 (基于内存的信号量 主要用于线程间的同步 也可以用于进程之间
但是不方便)
有名信号量(既可以用于进程 也可以用于线程)
信号量操作函数:
#include<semaphore.h>
int sem_init(sem_t *sem, int pshared,unsigned int vaule) // 信号量初始化
成功返回0 失败返回EOF
sem 指向要初始化的信号量对象
pshared 0 - 线程间 1 - 进程间
val 信号量初值
同文件同上
int sem_wait(sem_t *sem); //P操作
int sem_post(sem_t *sem); //V操作
成功返回0 失败返回EOF
sem 指向要操作的信号量对象
Ps: 两个线程同步读写缓冲区
char buf[32];
sem_t sem;
void *function(void *arg);
int main(void)
{
pthread_t a_thread;
if(sem_init(&sem,0, 0) < 0)
{
perror("sem_init");
exit(-1);
}
if(pthread_create(&a_thread, NULL, function, NULL) != 0)
{
printf("fila to pthread_create");
exit(-1);
}
printf("input 'quit' to exit\n");
do{
fgets(buf, 32, stdin);
sem_post(&sem);
}while(strncmp(buf, "quit", 4) != 0);
return 0;
}
void *function(void *arg)
{
while(1)
{
sen_wait(&sem);
printf("you enter %d characters\n", strlen(buf));
}
}
Ps: l两个线程同步读写
char buf[32];
sem_t sem_r, sem_w;
void *function(void *arg);
int main(void)
{
pthread_t a_thread;
if(sem_init(&sem_r,0, 0) < 0)
{
perror("sem_init");
exit(-1);
}
if(sem_init(&sem_w,0, 0) < 0)
{
perror("sem_init");
exit(-1);
}
if(pthread_create(&a_thread, NULL, function, NULL) != 0)
{
printf("fila to pthread_create");
exit(-1);
}
printf("input 'quit' to exit\n");
do{
sem_post(&sem_w);
fgets(buf, 32, stdin);
sem_wait(&sem_r);
}while(strncmp(buf, "quit", 4) != 0);
return 0;
}
void *function(void *arg)
{
while(1)
{
sen_wait(&sem_r);
printf("you enter %d characters\n", strlen(buf));
sen_post(&sem_w);
}
}
命令: gcc -o test test.c -lpthread
线程间通信————同步相关推荐
- Java并发——线程间通信与同步技术
传统的线程间通信与同步技术为Object上的wait().notify().notifyAll()等方法,Java在显示锁上增加了Condition对象,该对象也可以实现线程间通信与同步.本文会介绍有 ...
- Java多线程编程-(5)-使用Lock对象实现同步以及线程间通信
前几篇: Java多线程编程-(1)-线程安全和锁Synchronized概念 Java多线程编程-(2)-可重入锁以及Synchronized的其他基本特性 Java多线程编程-(3)-线程本地Th ...
- 线程同步--线程间通信
5月21日 线程同步--线程间通信 一.线程同步 线程的同步方法跟其他系统下类似,我们可以用原子操作,可以用 mutex,lock 等. iOS 的原子操作函数是以 OSAtomic 开头的,比如 ...
- 【Java 并发编程】多线程、线程同步、死锁、线程间通信(生产者消费者模型)、可重入锁、线程池
并发编程(Concurrent Programming) 进程(Process).线程(Thread).线程的串行 多线程 多线程的原理 多线程的优缺点 Java并发编程 默认线程 开启新线程 `Ru ...
- IOT-OS之RT-Thread(六)--- 线程间同步与线程间通信
文章目录 一.IPC对象管理 1.1 IPC对象控制块 1.2 IPC对象接口函数 二.线程间同步对象管理 2.1 信号量对象管理 2.2 互斥量对象管理 2.3 事件集对象管理 三.线程间通信对象管 ...
- Java基础学习——多线程(线程间通信-生产者消费者代码示例)
JDK 1.5提供了多线程升级方案 将同步synchronized替换成了显示的Lock操作.可以实现唤醒.冻结指定的线程. Lock接口 Lock 实现提供了比使用 synchronized 方法和 ...
- Net线程间通信的异步机制
线程间通信 我们看下面的图 图1 我们来看线程间通信的原理:线程(Thread B)和线程(Thread A)通信, 首先线程A 必须实现同步上下文对象(Synchronization Context ...
- java线程通信概念_java基础线程总结(线程概念、线程创建方式、线程间通信、线程重要方法)...
基础篇之<线程> @author :kern ---------------------------------------------------------------- 一:进程:是 ...
- 线程间通信的三种方法 (转)
http://www.cnblogs.com/puxidun/archive/2009/12/06/1618142.html 线程间通信的三种方法 多线程通信的方法主要有以下三种: 1.全局变量 进 ...
最新文章
- Android fill_parent、wrap_content和match_parent的区别
- 在Mac下安装JMeter
- php 16进制转换utf-8,php对unicode转utf-8编码
- Kafka分区分配策略(1)——RangeAssignor
- 时间序列与R语言应用(part4)--自回归AR模型及其平稳性条件
- CentOS7下PHPNginxMysql编译安装及sytemd配置
- js改变select下拉框默认选择的option
- Android 系统(248)---解读Android进程优先级ADJ算法
- html css important,css中的important是什么意思?
- 移动物联卡资费标准是如何的
- Java — java.lang.NullPointerException - 如何处理空指针异常
- gem install mysql2的时候出现的错误
- Atitit object 和class的理解 目录 1.1. 发现很多Object的方法都是相同的,他们被重复地放在一个个对象当中,太浪费了。	1 1.2. 那我们怎么把这些Object给创建起来
- oracle在cmd中启动数据库实例
- 知网html怎样转化成pdf,中国知网CAJ ASP文件转PDF教程
- 彻底卸载VMware软件
- html控制变量范围,加入控制变量后结果悲催了?!
- JavaScript提示框
- java开发面试自我介绍模板_java应聘面试自我介绍范文
- linux-2.6.32在mini2440开发板上移植(15)之移植看门狗驱动
热门文章
- hdu1247(Hat’s Words)
- (转)将cocos2dx项目从VS移植到Eclipse
- 2013年5月7日---JS中的正则
- An Algorithm Summary of Programming Collective Intelligence (1)
- linux下iostat命令无效,linux iostat命令详解
- oracle改了包怎么保存,Oracle存储过程、包、方法使用总结(推荐)
- leetcode怎么用时间刷_刷完700多题后的首次总结:LeetCode应该怎么刷?
- android 自定义actionbar,如何让android的actionbar浮动且透明
- android 动态生成fragment,Android动态加载fragment(fragment复用)
- c# 无法将类型隐式转换_C#中的隐式类型数组