linux信号量

简单线程池的设计

生来就可爱ヽ(ⅴ<●) 提交于 2019-11-26 19:28:14
  在网上观摩了一些大佬关于线程池的实现后,我决定也亲手写一下简单线程池,首先先解释一下什么是线程池,简单的来说, 就是预先创建一些线程,使它们处于睡眠状态,当任务来临时,唤醒线程让它们去执行。 使用线程池的好处有很多,比如,1.线程的创建和销毁的开销,无论从时间还是空间上来说是巨大的,而通过线程池的重用大大减少了这些不必要的开销,当然既然少了这么多消费内存的开销,其线程执行速度也是得到提升,2.还有有效的控制线程的并发数,控制线程的并发数可以有效的避免大量的线程争夺CPU资源而造成堵塞。   关于设计这个线程池,从概念出发,预先创建一些线程(创建线程,其后必须也伴随着销毁线程),使它们处于睡眠状态(挂起或者阻塞态),当任务来临时(设计一个队列专门装任务),唤醒线程并执行(线程函数所完成),同时再设计一个具体描述任务的父类并设置成纯虚函数,用户在使用此线程池的时候,只需要重写父类就可以了,所以大致需要实现的功能如下图所示: 接下来按每个功能进行讲述: 1.创建线程 1 //先检查参数正确性 2 if(ThreadNUM_MIN < 0 || ThreadNUM_MAX < ThreadNUM_MIN) 3 return false; 4 //创建信号量(在创建线程前创建信号量,防止线程空转) 5 m_hSemphore = CreateSemaphore(NULL,0

Linux -- 进程间通信之信号量

不问归期 提交于 2019-11-26 02:32:04
基本概念简述 多个线程同时访问一个共享数据,很可能造成恶劣的后果;为了保证数据访问资源的正确性和安全性,需要对线程进行"同步" (Linux下所有的执行实体都称为任务(task),每个任务类似于单线程的进程,共享了同一个内存空间的多个任务构成了一个进程) 同步 指在一个线程对数据访问未结束的时候,其他线程不得访问同一个数据,将对数据的访问原子化 原子操作 不可分割,不会被线程调度打断的操作 (一个程序在运行的过程中可能被优先级更高的线程中断,而有些操作是不可中断的,不然会出现无法还原的后果,这时候操作系统就需要原子操作) 线程同步 同步最常用的方式"锁",每一个线程访问数据或资源前首先要获取锁,并在访问结束后释放锁;在锁被占用时试图获取锁,线程会进入等待,直到锁重新可用 二元信号量是最简单的一种锁,适合被一个线程独占访问的资源。它只有两种状态,占用和非占用;当一个线程获取锁后,其他线程试图获取锁将进入等待,直到该锁被释放。 互斥量类似于二元信号量,资源同时只允许一个线程访问,不同的是信号量在整个系统中允许任何线程获取并释放,即信号量可以被系统中一个线程获取,然后由另一个线程释放它;而互斥锁要求哪个线程获取互斥量,这个线程就要负责释放这个锁,其他线程释放该互斥量是无效的 临界资源 一次仅允许一个进程访问的资源称为临界资源,通常用互斥量控制临界资源的访问 P(测试)/ V(增加)操作