条件变量

线程基础

﹥>﹥吖頭↗ 提交于 2019-11-28 17:33:45
摘要:在计算机发展早期,CPU的资源十分昂贵,如果一个CPU只能运行一个程序,那么当读写磁盘是CPU就只能处于空闲状态,造成了极大的浪费。从而有了 多道程序 的方式,即编译一个监控程序,当程序不需要使用CPU时,将其他在等待CPU的程序启动。该方式大大提高了CPU的利用率,但它的弊端是不分轻重缓急,有时候一个交互操作可能要等待数十分钟。 分时系统 :每个CPU运行一段时间后,就主动让出给其他CPU使用。Windows早期版本和Mac OS版本都是采用的这种分时系统来调度程序的。但是一旦有任何程序出现问题无法主动让出CPU给其它程序的话那么操作系统也没有办法,其它程序只能等待,造成死机假象。 多任务系统 :操作系统接管了所有的硬件资源,并且本身运行在一个受硬件保护的级别。所有的应用都以进程的方式运行在比操作系统更低的级别,每个进程都有自己独立的地址空间,使得进程之间的地址空间相互隔离。CPU由操作系统进行同一分配,每个进程根据进程优先级的高低都有机会获得CPU,但如果运行超过一定的时间,CPU会将资源分配给其他进程,这种CPU分配方式是抢占式,操作系统可以强制剥夺CPU资源并且分配给它认为目前最需要的进程。如果操作系统分配每个进程的时间很短,就会造成很多进程都在同时运行的假象,即所谓的宏观并行,微观串行。 什么是线程 线程(Thread),有时被称为轻量级进程(Lightweight

J.U.C并发包(1)

北慕城南 提交于 2019-11-28 01:17:12
J.U.C并发包(1) AbstractQueuedSynchronizer AbstractQueuedSynchronizer是JUC并发包中锁的底层支持,AbstractQueuedSynchronizer是抽象同步队列,简称AQS,是实现同步器的基础组件,并发包中锁的实现底层就是使用AQS实现, 从类图的关系可以看到AQS是一个FIFO的双向队列,内部通过节点head 和 tail 记录队首和队尾元素,队列元素类型为Node。其中Node中Thread变量用来存放进入AQS队列里面的线程 Node 节点内部SHARED用来标记该线程是获取共享资源时候被阻塞挂起来后放入AQS队列, EXCLUSIVE标记线程是获取独占资源时候被挂起后放入AQS队列; waitStatus记录当前线程等待状态,分别为CANCELLED(线程被取消了),SIGNAL(线程需要被唤醒),CONDITION(线程在条件队列里面等待),PROPAGATE(释放共享资源时候需要通知其他节点); AQS中维持了一个单一的状态信息state,可以通过getState,setState,compareAndSetState 函数修改其值;对于ReentrantLock 的实现来说,state 可以用来表示当前线程获取锁的可重入次数; pre记录当前节点的前驱节点,next记录当前节点后继节点

实验二

泪湿孤枕 提交于 2019-11-27 19:40:52
北京电子科技学院(BESTI) 实验报告 课程:信息安全系统设计基础 班级:1353 姓名:王维臻 武西垚 学号:20135336 20135332 成绩: 指导教师:娄家鹏 实验日期:2015.11.10 实验密级: 预习程度: 实验时间:15:30~18:00 仪器组次: 必修/选修: 实验序号:2 实验名称:固件设计 实验目的与要求: 1掌握程序的烧写方法 2能够实现Bootloader 3实现密码学中常见算法的固化。 内容: 1读懂 pthread.c 的源代码,熟悉几个重要的PTHREAD库函数的使用。 2掌握共享锁和信号量的使用方法。 3进入/arm2410cl/exp/basic/02_pthread 目录,运行make 产生pthread程序,使用NFS方式连接开发主机进行运行实验。 实验仪器: 名 称 型 号 数 量 PC Lenovo 1 Laptop Sony 1 虚拟Linux环境 Redhat 9.0 1 ARM开发板 UP-NETARM2410-CL 1 实验内容、步骤与体会: 开发环境的配置同实验一,将实验代码拷贝到共享文件夹中。在虚拟机中编译代码,对于多线程相关的代码,编译时需要加-lpthread 的库。下载调试,在超级终端中运行可执行文件pthread,运行可执行文件term。将实验代码拷贝到共享文件夹中 实验原理及代码解析 原理背景

Linux下条件变量详解

走远了吗. 提交于 2019-11-27 16:31:40
条件变量可以让线程在满足特定的条件下暂停(睡眠),需要与互斥量配合使用。 pthread_cond_t cond = PTHREAD_COND_INITIALIZER; 通过宏对条件变量初始化 int pthread_cond_init (pthread_cond_t cond,pthread_condattr_t cond_attr); 功能:初始化条件变量 cond:待初始化的条件变量 cond_attr:条件变量的属性 int pthread_cond_destroy(pthread_cond_t *cond); 功能:销毁条件变量 int pthread_cond_wait (pthread_cond_t *cond,pthread_mutex_t *mutex); 功能:让调用者线程进入睡眠,并解锁一个互斥量 cond:线程睡入的条件变量 mutex:线程睡眠前的要解锁的互斥量(是不是锁定状态没有关系) int pthread_cond_signal(pthread_cond_t *cond); 功能:唤醒条件变量中的一个线程 注意:线程醒的前提条件是互斥量必须是解锁状态的,线程醒前会再次加锁,如果不能加锁就不会醒来。 int pthread_cond_timedwait (pthread_cond_t *cond,pthread_mutex_t *mutex

Linux多线程 sleep, pthread_cond_timedwait 【转】

人盡茶涼 提交于 2019-11-26 18:32:18
原文:http://blog.hiwgy.com/2011/06/02/pthread_cond_timedwait/ 摘要:多线程编程中,线程A循环计算,然后sleep一会接着计算(目的是减少CPU利用率);存在的问题是,如果要关闭程序,通常选择join线程A等待线程A退出,可是我们必须等到sleep函数返回,该线程A才能正常退出,这无疑减慢了程序退出的速度。当然,你可以terminate线程A,但这样做很不优雅,且会存在一些未知问题。采用 pthread_cond_timedwait (pthread_cond_t * cond, pthread_mutex_t *mutex, const struct timespec * abstime)可以优雅的解决该问题,设置等待条件变量cond,如果超时,则返回;如果等待到条件变量cond,也返回。本文暂不将内部机理,仅演示一个demo。 首先,看这段代码,thr_fn为一个线程函数: bool flag = true ; void * thr_fn( void * arg) { while (flag){ printf( " .\n " ); sleep( 10 ); } printf( " thread exit\n " ); } int main() { pthread_t thread; if ( 0 != pthread