条件变量

线程同步,条件变量pthread_cond_wait

混江龙づ霸主 提交于 2020-01-01 00:24:11
与互斥锁不同,条件变量是用来等待而不是用来上锁的。条件变量用来自动阻塞一个线程,直到某特殊情况发生为止。条件变量使我们可以睡眠等待某种条件出现。 条件变量是利用线程间共享的全局变量进行同步的一种机制, 主要包括两个动作: 一个线程等待"条件变量的条件成立"而挂起;另一个线程使"条件成立"(给出条件成立信号)。 条件的检测是在互斥锁的保护下进行的。如果条件为假,一个线程自动阻塞,并释放等待状态改变的互斥锁。 pthread_cond_wait 原子调用: 等待条件变量, 解除锁, 然后阻塞 当 pthread_cond_wait 返回,则条件变量有信号,同时上锁 等待条件有两种方式: 条件等待pthread_cond_wait()和计时等待pthread_cond_timedwait(), 其中计时等待方式如果在给定时刻前条件没有满足,则返回ETIMEOUT 无论哪种等待方式,都必须和一个互斥锁配合,以防止多个线程同时请求pthread_cond_wait() (或pthread_cond_timedwait(),下同)的竞争条件(Race Condition)。 mutex互斥锁必须是普通锁(PTHREAD_MUTEX_TIMED_NP)或者适应锁(PTHREAD_MUTEX_ADAPTIVE_NP), 且在调用pthread_cond_wait()前必须由本线程加锁

信号量与条件变量的区别

。_饼干妹妹 提交于 2020-01-01 00:22:59
注意信号量与条件变量的区别 信号量内容可见:http://www.cnblogs.com/charlesblc/p/6142868.html 信号量、共享内存,以及消息队列等System V IPC三剑客主要关注 进程间通信 ; 而条件变量、互斥锁,主要关注 线程间通信 。 下面内容参考: http://blog.chinaunix.net/uid-27164517-id-3282242.html pthread_cond_wait指的是 条件变量 ,总和一个 互斥锁结合使用 。在 调用pthread_cond_wait前要先获取锁 。pthread_cond_wait函数执行时先 自动释放 指定的锁,然后等待条件变量的变化。在函数调用返回之前,自动将指定的互斥量 重新锁住 。 int pthread_cond_signal(pthread_cond_t * cond); pthread_cond_signal通过条件变量 cond发送消息 ,若多个消息在等待,它 只唤醒一个 。 pthread_cond_broadcast可以唤醒所有。调用pthread_cond_signal后要 立刻释放互斥锁 ,因为pthread_cond_wait的最后一步是要将指定的互斥量重新锁住,如果pthread_cond_signal之后没有释放互斥锁,pthread_cond_wait仍然要阻塞

条件变量生产者和消费者模型

北战南征 提交于 2019-12-31 03:29:47
生产者消费者条件变量模型 线程同步典型的案例即为生产者消费者模型,而借助条件变量来实现这一模型,是比较常见的一种方法。假定有两个线程,一个模拟生产者行为,一个模拟消费者行为。两个线程同时操作一个共享资源(一般称之为汇聚),生产向其中添加产品,消费者从中消费掉产品。 #include <stdlib.h> #include <unistd.h> #include <pthread.h> struct msg { struct msg *next; int num; }; struct msg *head; //静态初始化 一个条件变量 和 一个互斥变量 可以代替init函数 pthread_cond_t has_product = PTHREAD_COND_INITIALIZER; pthread_mutex_t lock = PTHREAD_MUTEX_INITIALIZER; void *consumer(void *p) { struct msg *mp; for (;;) { pthread_mutex_lock(&lock); while (head == NULL) { //头指针为空,说明没有节点 pthread_cond_wait(&has_product, &lock); } mp = head; head = mp->next; //模拟消费掉一个产品

linux 多线程编程

穿精又带淫゛_ 提交于 2019-12-24 12:27:07
原文地址: 1.Linux“线程” 进程与线程之间是有区别的,不过Linux内核只提供了轻量进程的支持,未实现线程模型。Linux是一种“多进程单线程”的操作系统。Linux本身只有进程的概念,而其所谓的“线程”本质上在内核里仍然是进程。 大家知道,进程是资源分配的单位,同一进程中的多个线程共享该进程的资源(如作为共享内存的全局变量)。Linux中所谓的“线程”只是在被创建时clone了父进程的资源,因此clone出来的进程表现为“线程”,这一点一定要弄清楚。因此,Linux“线程”这个概念只有在打冒号的情况下才是最准确的。 目前Linux中最流行的线程机制为LinuxThreads,所采用的就是线程-进程“一对一”模型,调度交给核心,而在用户级实现一个包括信号处理在内的线程管理机制。LinuxThreads由Xavier Leroy (Xavier.Leroy@inria.fr)负责开发完成,并已绑定在GLIBC中发行,它实现了一种BiCapitalized面向Linux的Posix 1003.1c “pthread”标准接口。Linuxthread可以支持Intel、Alpha、MIPS等平台上的多处理器系统。 按照POSIX 1003.1c 标准编写的程序与Linuxthread 库相链接即可支持Linux平台上的多线程,在程序中需包含头文件pthread. h

互斥和条件变量区别

限于喜欢 提交于 2019-12-21 12:04:01
互斥量(mutex)从本质上说是一把锁,在访问共享资源前对互斥量进行加锁,在访问完成后释放互斥量上的锁。对互斥量进行加锁以后,任何其他试图再次对互斥锁加锁的线程将会阻塞直到当前线程释放该互斥锁。如果释放互斥锁时有多个线程阻塞,所有在该互斥锁上的阻塞线程都会变成可运行状态,第一个变为运行状态的线程可以对互斥锁加锁,其他线程将会看到互斥锁依然被锁住,只能回去再次等待它重新变为可用。 条件变量(cond)是在多线程程序中用来实现”等待–》唤醒”逻辑常用的方法。条件变量利用线程间共享的全局变量进行同步的一种机制,主要包括两个动作:一个线程等待”条件变量的条件成立”而挂起;另一个线程使“条件成立”。为了防止竞争,条件变量的使用总是和一个互斥锁结合在一起。线程在改变条件状态前必须首先锁住互斥量,函数pthread_cond_wait把自己放到等待条件的线程列表上,然后对互斥锁解锁(这两个操作是原子操作)。在函数返回时,互斥量再次被锁住。 第一点,首先我们要理解条件变量的作用是在等待某个条件达成时自身要进行睡眠或阻塞,避免忙等待带来的不必要消耗,所以条件变量的作用在于同步。条件变量这个变量其实本身不包含条件信息,条件的判断不在pthread_cond_wait函数功能中,而需要外面进行条件判断。这个条件通常是多个线程或进程的共享变量,这样就很清楚了

Monitor机制

心已入冬 提交于 2019-12-19 05:31:19
Monitor机制 monitor概要 Java 语言实现 monitor 机制,属于编译器的工作。 monitor机制需要3个元素配合使用,分别是: 临界区 monitor 对象及锁 条件变量以及定义在 monitor 对象上的 wait,signal 操作 使用monitor机制让互斥进入临界区,用monitor 对象来保存被阻塞的线程,由于 monitor 机制本质上是基于 mutex 这种基本原语的,所以 monitor object 还必须维护一个基于 mutex 的锁。而条件变量的引入是为了能够在适当的时候阻塞和唤醒 进程/线程,由这个条件变量来确定什么时候是“适当的时候”。条件变量的定义有很大的自主性 monitor实现 monitor是操作系统提出的一种高级原语。monitor在java的具体实现是依靠synchronized 关键字来修饰实例方法、类方法以及代码块,被 synchronized 关键字修饰的方法、代码块,就是 monitor 机制的临界区。 synchronized关联的对象就是 monitor object。monitor object 充当着维护 mutex以及定义 wait/signal API 来管理线程的阻塞和唤醒的角色。 java.lang.Object 类定义了 wait(),notify(),notifyAll() 方法

条件变量与生产者消费者问题

佐手、 提交于 2019-12-17 08:57:23
文章目录 使用 if而非 while且只有一个条件变量 使用while但只有一个条件变量 使用while且有两个条件变量 扩展缓冲区大小(从1到数组) 本文主要是探讨<<操作系统导论>>一书第30章-条件变量的知识. 书中介绍了条件变量的概念, 并将条件变量运用在生产者消费者问题中. 从最简单的情况开始, 列举了使用条件变量解决生产者消费者问题的几种错误用法. 本文主要是对这几种情况的代码模拟分析, 分为以下四个部分 使用 if而非 while且只有一个条件变量 使用while但只有一个条件变量 使用while且有两个条件变量 扩展缓冲区大小(从1到数组) 使用 if而非 while且只有一个条件变量 书中提供的第一个方案(有问题), 给生产者和消费者共用一个条件变量, 且使用if来判断缓存区 问题: wait的条件使用了if而不是while, 导致如果有多个消费者的情况, 当一个阻塞的消费者被生产者唤醒了, 准备执行但这时另一个消费者抢占执行并进行了消费导致缓冲区空了. 这时切换到第一个消费者消费, 因为缓冲区空了触发断言, 程序错误. 如果换成while, 那么第二个消费者在醒来的时候, 就会再判断一下条件是否成立, 由于被另一个消费者消费了, 所以它又会调用wait被阻塞. 需要注意wait函数的执行过程. 当一个线程执行wait的时候, 会释放它持有的锁,

编程小知识之 虚假唤醒(spurious wakeup)

此生再无相见时 提交于 2019-12-17 08:36:52
本文简单介绍了一些 虚假唤醒(spurious wakeup) 相关的知识 (注: 本文假设读者对多线程开发有一定了解) 高层次的多线程编程中, 条件变量 是个常见的同步方法,跟传统仅使用 互斥量 的方法相比,条件变量可以减少锁的竞争. 拿 Pthread 举例,一个常见的条件变量的使用示例大概是这个样子的: // flag for sync bool g_signaled = false; pthread_mutex_t g_mutex; pthread_cond_t g_cond; // wait method void wait() { pthread_mutex_lock(&g_mutex); while (!g_signaled) { pthread_cond_wait(&g_cond, &g_mutex); } g_signaled = false; pthread_mutex_unlock(&g_mutex); } // signal method void signal() { pthread_mutex_lock(&g_mutex); g_signaled = true; pthread_mutex_unlock(&g_mutex); pthread_cond_signal(&g_cond); } 代码中调用的 pthread_cond_wait 方法

ucore lab 7

自古美人都是妖i 提交于 2019-12-11 17:50:51
OS ucore lab 7 练习零: 填写已有实验: 复制以下文件 其中 trap.c 需要进行修正 vmm.c trap.c default_pmm.c pmm.c proc.c swap_fifo.c trap.c: static void trap_dispatch(struct trapframe *tf) { ++ticks; /** 注销掉下面这一句 因为这一句被包含在了 run_timer_list() run_timer_list() 在之前的基础上 加入了对 timer 的支持 ***/ // sched_class_proc_tick(current); run_timer_list(); } 练习一:理解内核级信号量的实现和基于内核级信号量的哲学家就餐问题(不需要编码)   完成练习0后,建议大家比较一下(可用kdiff3等文件比较软件)个人完成的lab6和练习0完成后的刚修改的lab7之间的区别,分析了解lab7采用信号量的执行过程。执行make grade,大部分测试用例应该通过。 请在实验报告中 Q1: 给出内核级信号量的设计描述,并说其大致执行流流程。 Q2:请在实验报告中给出给用户态进程/线程提供信号量机制的设计方案,并比较说明给内核级提供信号量机制的异同。 Q1: // 先是定义了一个信号量的数据结构 typedef struct { int

Gan论文阅读 Conditional Generative Adversarial Nets

倾然丶 夕夏残阳落幕 提交于 2019-12-10 20:04:30
Title:Conditional Generative Adversarial Nets Paper: pdf 摘要:介绍一种有条件的Gan,通过输入数据y来构造。做了2个实验,根据类标签生成MNIST数字和学习一个多模态模型,该方法成功生成了不属于训练标签的描述性标记。 一. CGAN思想 这项工作提出了一种带条件约束的GAN,在生成模型(D)和判别模型(G)的建模中均引入条件变量y(conditional variable y),使用额外信息y对模型增加条件,可以指导数据生成过程。这些条件变量y可以基于多种信息,例如类别标签,用于图像修复的部分数据,来自不同模态(modality)的数据。如果条件变量y是类别标签,可以看做CGAN 是把纯无监督的 GAN 变成有监督的模型的一种改进。这个简单直接的改进被证明非常有效,并广泛用于后续的相关工作中。Mehdi Mirza et al. 的工作是在MNIST数据集上以类别标签为条件变量,生成指定类别的图像。作者还探索了CGAN在用于图像自动标注的多模态学习上的应用,在MIR Flickr25000数据集上,以图像特征为条件变量,生成该图像的tag的词向量。 二. 相关工作 许多有趣的问题更自然地被认为是概率一对多映射。例如,在图像标记的情况下,可能有许多不同的标签可以适当地应用于给定的图像,不同的(人类)注释器可能使用不同的