同步

是指多个任务按照约定的先后次序 相互配合完成一件事情

信号量:

由信号量决定 线程是继续执行 还是阻塞等待

信号量代表某种资源 其值表示系统中该资源的数量

信号量是一个受保护的量 只能通过特定的三种操作来访问

初始化

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

线程间通信————同步相关推荐

  1. Java并发——线程间通信与同步技术

    传统的线程间通信与同步技术为Object上的wait().notify().notifyAll()等方法,Java在显示锁上增加了Condition对象,该对象也可以实现线程间通信与同步.本文会介绍有 ...

  2. Java多线程编程-(5)-使用Lock对象实现同步以及线程间通信

    前几篇: Java多线程编程-(1)-线程安全和锁Synchronized概念 Java多线程编程-(2)-可重入锁以及Synchronized的其他基本特性 Java多线程编程-(3)-线程本地Th ...

  3. 线程同步--线程间通信

    5月21日 线程同步--线程间通信 一.线程同步  线程的同步方法跟其他系统下类似,我们可以用原子操作,可以用 mutex,lock 等.  iOS 的原子操作函数是以 OSAtomic 开头的,比如 ...

  4. 【Java 并发编程】多线程、线程同步、死锁、线程间通信(生产者消费者模型)、可重入锁、线程池

    并发编程(Concurrent Programming) 进程(Process).线程(Thread).线程的串行 多线程 多线程的原理 多线程的优缺点 Java并发编程 默认线程 开启新线程 `Ru ...

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

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

  6. Java基础学习——多线程(线程间通信-生产者消费者代码示例)

    JDK 1.5提供了多线程升级方案 将同步synchronized替换成了显示的Lock操作.可以实现唤醒.冻结指定的线程. Lock接口 Lock 实现提供了比使用 synchronized 方法和 ...

  7. Net线程间通信的异步机制

    线程间通信 我们看下面的图 图1 我们来看线程间通信的原理:线程(Thread B)和线程(Thread A)通信, 首先线程A 必须实现同步上下文对象(Synchronization Context ...

  8. java线程通信概念_java基础线程总结(线程概念、线程创建方式、线程间通信、线程重要方法)...

    基础篇之<线程> @author :kern ---------------------------------------------------------------- 一:进程:是 ...

  9. 线程间通信的三种方法 (转)

    http://www.cnblogs.com/puxidun/archive/2009/12/06/1618142.html 线程间通信的三种方法 多线程通信的方法主要有以下三种:  1.全局变量 进 ...

最新文章

  1. Android fill_parent、wrap_content和match_parent的区别
  2. 在Mac下安装JMeter
  3. php 16进制转换utf-8,php对unicode转utf-8编码
  4. Kafka分区分配策略(1)——RangeAssignor
  5. 时间序列与R语言应用(part4)--自回归AR模型及其平稳性条件
  6. CentOS7下PHPNginxMysql编译安装及sytemd配置
  7. js改变select下拉框默认选择的option
  8. Android 系统(248)---解读Android进程优先级ADJ算法
  9. html css important,css中的important是什么意思?
  10. 移动物联卡资费标准是如何的
  11. Java — java.lang.NullPointerException - 如何处理空指针异常
  12. gem install mysql2的时候出现的错误
  13. Atitit object 和class的理解 目录 1.1. 发现很多Object的方法都是相同的,他们被重复地放在一个个对象当中,太浪费了。 1 1.2. 那我们怎么把这些Object给创建起来
  14. oracle在cmd中启动数据库实例
  15. 知网html怎样转化成pdf,中国知网CAJ ASP文件转PDF教程
  16. 彻底卸载VMware软件
  17. html控制变量范围,加入控制变量后结果悲催了?!
  18. JavaScript提示框
  19. java开发面试自我介绍模板_java应聘面试自我介绍范文
  20. linux-2.6.32在mini2440开发板上移植(15)之移植看门狗驱动

热门文章

  1. hdu1247(Hat’s Words)
  2. (转)将cocos2dx项目从VS移植到Eclipse
  3. 2013年5月7日---JS中的正则
  4. An Algorithm Summary of Programming Collective Intelligence (1)
  5. linux下iostat命令无效,linux iostat命令详解
  6. oracle改了包怎么保存,Oracle存储过程、包、方法使用总结(推荐)
  7. leetcode怎么用时间刷_刷完700多题后的首次总结:LeetCode应该怎么刷?
  8. android 自定义actionbar,如何让android的actionbar浮动且透明
  9. android 动态生成fragment,Android动态加载fragment(fragment复用)
  10. c# 无法将类型隐式转换_C#中的隐式类型数组