个人教程网站,有哪些网站做的比较好看的图片,商务网站建设实训报告1500字,湖南人文科技学院继续教育学院Linux POSIX信号量 线程池 一. 什么是POSIX信号量#xff1f;二. POSIX信号量实现原理三. POSIX信号量接口函数四. 基于环形队列的生产消费模型五. 线程池 一. 什么是POSIX信号量#xff1f;
POSIX信号量是一种用于同步和互斥操作的机制#xff0c;属于POSIX#xff08;Po… Linux POSIX信号量 线程池 一. 什么是POSIX信号量二. POSIX信号量实现原理三. POSIX信号量接口函数四. 基于环形队列的生产消费模型五. 线程池 一. 什么是POSIX信号量
POSIX信号量是一种用于同步和互斥操作的机制属于POSIXPortable Operating System Interface 标准的一部分。这一标准定义了操作系统应该为应用程序提供的接口而POSIX信号量是在多线程和多进程环境下实现同步的一种方式。
信号量本质上是一个计数器用于描述临界资源的数量。在多线程或多进程的情况下当多个执行单元线程或进程需要访问共享资源时使用信号量可以有效地协调它们的行为避免竞争条件和提高程序的可靠性。
二. POSIX信号量实现原理
POSIX信号量的实现原理基于一个计数器和一个等待队列。关键的操作包括P操作和V操作 P操作申请信号量如果信号量计数器大于零表示资源可用计数器减一如果计数器为零线程将被阻塞并加入等待队列。 V操作释放信号量计数器加一并唤醒等待队列中的一个线程。 具体实现原理如下
信号量结构包括计数器和等待队列。当计数器为零时表示资源不可用线程申请信号量时将被阻塞并放入等待队列。当计数器大于零时表示资源可用线程申请信号量时计数器减一线程获得资源。当释放信号量时计数器加一如果等待队列不为空唤醒等待队列中的一个线程。
三. POSIX信号量接口函数 sem_t 是一个数据类型用于表示信号量。作为同步机制的一部分信号量用于协调共享资源的访问。用户通过提供的接口函数如 sem_init、sem_wait、sem_post来操作信号量 初始化信号量
#include semaphore.h
int sem_init(sem_t *sem, int pshared, unsigned int value);sem: 指向要初始化的信号量的指针。 pshared: 0表示信号量在线程间共享非零表示在进程间共享。 value: 信号量的初始值。 返回值成功时返回0失败时返回-1。 等待信号量
#include semaphore.h
int sem_wait(sem_t *sem); // P()sem: 指向要等待的信号量的指针。 功能等待信号量将信号量的值减1。如果信号量的值为0线程将被阻塞。 返回值成功时返回0失败时返回-1。 释放信号量
#include semaphore.h
int sem_post(sem_t *sem); // V()sem: 指向要发布的信号量的指针。 功能释放信号量表示资源使用完毕将信号量的值加1。通常用于释放信号。 返回值成功时返回0失败时返回-1。 销毁信号量
#include semaphore.h
int sem_destroy(sem_t *sem);sem: 要销毁的信号量的指针。 返回值成功时返回0失败时返回-1。 四. 基于环形队列的生产消费模型
环形队列简介 环形队列是一种基于数组或链表的数据结构具有循环特性。其关键特点包括循环性、高效性和固定大小。常用于缓冲区、循环缓存和生产者-消费者模型等场景。由于采用模运算插入和删除操作的时间复杂度为O(1)使得其在实时系统和有限资源的应用中得以广泛应用。 放数据操作 等待生产者信号量 通过 P(prodSemaphore)生产者等待信号量确保有足够的空间可供数据生产。 将数据放入缓冲区 数据被放入环形缓冲区的当前生产者索引位置 (buffer_[prodIndex])。 生产者索引 prodIndex 被更新并通过取模操作确保索引在缓冲区容量内循环。 发送消费者信号量 通过 V(consSemaphore)生产者通知消费者有新的数据可供消费。 拿数据操作 等待消费者信号量 通过 P(consSemaphore)消费者等待信号量确保有足够的数据可供消费。 从缓冲区取出数据 数据被从环形缓冲区的当前消费者索引位置取出 (buffer_[consIndex])。 消费者索引 consIndex 被更新并通过取模操作确保索引在缓冲区容量内循环。 发送生产者信号量 通过 V(prodSemaphore)消费者通知生产者有空间可供数据生产。 五. 线程池
什么是线程池 线程池是一种常见的多线程使用模式。它通过维护一组线程等待监督管理者分配可并发执行的任务。这种设计避免了在处理短时间任务时创建与销毁线程的开销提高了系统性能。线程池通过保证内核的充分利用同时防止过度调度对于某些应用场景尤其有效。
实例创建一个简单的固定数量线程池
#include iostream
#include queue
#include vector
#include pthread.h
#include unistd.h
using namespace std;// 线程数据结构
struct threaddata
{pthread_t tid; // 线程ID
};// 任务类
class Task
{
public:Task(int data) : data_(data){}// 重载运算符用于执行任务void operator()(){run();}
private:// 任务执行函数void run(){cout 数据 data_ endl;}int data_;
};// 线程池模板类
templateclass T
class ThreadPool
{
public:// 构造函数默认线程数为6ThreadPool(int n 6) : td(6){pthread_mutex_init(mutex_, nullptr); // 初始化互斥锁pthread_cond_init(cond_, nullptr); // 初始化条件变量}// 析构函数~ThreadPool(){pthread_mutex_destroy(mutex_); // 销毁互斥锁pthread_cond_destroy(cond_); // 销毁条件变量}// 线程处理函数static void* handler(void* args){ThreadPoolT* tp static_castThreadPoolT*(args);while (1){tp-lock(); // 加锁保护临界区while (tp-isQueueEmpty()){tp-wait(); // 当任务队列为空时等待条件变量}T data tp-queueFront(); // 获取任务队列的队首元素tp-queuePop(); // 弹出任务队列的队首元素tp-unlock(); // 解锁释放临界区data(); // 执行任务}}// 启动线程池void start(){for (int i 0; i td.size(); i){pthread_create((td[i].tid), nullptr, handler, static_castvoid*(this)); // 创建线程}}// 将任务放入任务队列void push(T data){lock(); // 加锁确保线程安全task.push(data); // 将任务加入队列wakeup(); // 唤醒等待的线程unlock(); // 解锁释放锁允许其他线程访问任务队列}// 判断任务队列是否为空bool isQueueEmpty(){return task.empty();}// 获取任务队列的队首元素T queueFront(){return task.front();}// 弹出任务队列的队首元素void queuePop(){task.pop();}public:// 加锁操作void lock(){pthread_mutex_lock(mutex_);}// 解锁操作void unlock(){pthread_mutex_unlock(mutex_);}// 等待条件变量void wait(){pthread_cond_wait(cond_, mutex_);}// 唤醒等待条件变量的线程void wakeup(){pthread_cond_signal(cond_);}private:vectorthreaddata td; // 线程数据queueT task; // 任务队列pthread_mutex_t mutex_; // 互斥锁pthread_cond_t cond_; // 条件变量
};int main()
{srand(time(nullptr));ThreadPoolTask thread(6); // 创建线程池设置线程数为6thread.start(); // 启动线程池while (1){Task d(rand() % 100);thread.push(d); // 将任务放入线程池sleep(1);}return 0;
}线程池模板类 ThreadPool 创建了一个线程池类模板参数为任务类型 T默认线程数为6。 使用 pthread 库提供的互斥锁和条件变量来实现线程同步。 提供了启动线程池的 start 函数创建指定数量的线程并在这些线程中执行 handler 函数。 提供了将任务推送到任务队列的 push 函数该函数会将任务加入队列唤醒等待中的线程。 任务类 Task 任务类用于封装线程池中执行的具体任务其中包含一个整数类型的数据。 通过重载 () 运算符实现了任务的执行函数输出任务的数据。 线程处理函数 handler 作为线程的入口函数不断从任务队列中取出任务并执行。 使用互斥锁保护任务队列条件变量用于在任务队列为空时等待新任务。 通过调用线程池的成员函数来实现任务的执行、入队、出队等操作。 主函数 main 在主函数中创建了一个 ThreadPool 对象设置线程数为6并启动线程池。 进入无限循环每次循环生成一个随机数创建一个包含该随机数的 Task 对象并通过线程池的 push 函数将任务推送到任务队列中。 程序不断创建新的任务由线程池中的线程执行。
文章转载自: http://www.morning.mkyny.cn.gov.cn.mkyny.cn http://www.morning.ykrss.cn.gov.cn.ykrss.cn http://www.morning.cfnsn.cn.gov.cn.cfnsn.cn http://www.morning.wnjsp.cn.gov.cn.wnjsp.cn http://www.morning.wspyb.cn.gov.cn.wspyb.cn http://www.morning.fcwxs.cn.gov.cn.fcwxs.cn http://www.morning.fzwf.cn.gov.cn.fzwf.cn http://www.morning.wfyqn.cn.gov.cn.wfyqn.cn http://www.morning.ljxxl.cn.gov.cn.ljxxl.cn http://www.morning.hghhy.cn.gov.cn.hghhy.cn http://www.morning.lbbrw.cn.gov.cn.lbbrw.cn http://www.morning.mrpqg.cn.gov.cn.mrpqg.cn http://www.morning.zgdnz.cn.gov.cn.zgdnz.cn http://www.morning.lydtr.cn.gov.cn.lydtr.cn http://www.morning.zkqsc.cn.gov.cn.zkqsc.cn http://www.morning.rhjhy.cn.gov.cn.rhjhy.cn http://www.morning.leboju.com.gov.cn.leboju.com http://www.morning.lgphx.cn.gov.cn.lgphx.cn http://www.morning.mhmsn.cn.gov.cn.mhmsn.cn http://www.morning.qgghj.cn.gov.cn.qgghj.cn http://www.morning.beijingzy.com.cn.gov.cn.beijingzy.com.cn http://www.morning.qzpsk.cn.gov.cn.qzpsk.cn http://www.morning.gassnw.com.gov.cn.gassnw.com http://www.morning.cdlewan.com.gov.cn.cdlewan.com http://www.morning.hnmbq.cn.gov.cn.hnmbq.cn http://www.morning.jmmzt.cn.gov.cn.jmmzt.cn http://www.morning.nnwpz.cn.gov.cn.nnwpz.cn http://www.morning.ffbl.cn.gov.cn.ffbl.cn http://www.morning.gzzxlp.com.gov.cn.gzzxlp.com http://www.morning.fcqlt.cn.gov.cn.fcqlt.cn http://www.morning.dxqfh.cn.gov.cn.dxqfh.cn http://www.morning.ntgrn.cn.gov.cn.ntgrn.cn http://www.morning.qmbgb.cn.gov.cn.qmbgb.cn http://www.morning.jyjqh.cn.gov.cn.jyjqh.cn http://www.morning.sqnrz.cn.gov.cn.sqnrz.cn http://www.morning.mcgsq.cn.gov.cn.mcgsq.cn http://www.morning.xnpj.cn.gov.cn.xnpj.cn http://www.morning.ndzhl.cn.gov.cn.ndzhl.cn http://www.morning.bhznl.cn.gov.cn.bhznl.cn http://www.morning.nkyqh.cn.gov.cn.nkyqh.cn http://www.morning.yongkangyiyuan-pfk.com.gov.cn.yongkangyiyuan-pfk.com http://www.morning.ckrnq.cn.gov.cn.ckrnq.cn http://www.morning.ycwym.cn.gov.cn.ycwym.cn http://www.morning.htsrm.cn.gov.cn.htsrm.cn http://www.morning.mkrqh.cn.gov.cn.mkrqh.cn http://www.morning.stph.cn.gov.cn.stph.cn http://www.morning.mlnbd.cn.gov.cn.mlnbd.cn http://www.morning.rccpl.cn.gov.cn.rccpl.cn http://www.morning.btwlp.cn.gov.cn.btwlp.cn http://www.morning.ldsgm.cn.gov.cn.ldsgm.cn http://www.morning.rxwnc.cn.gov.cn.rxwnc.cn http://www.morning.tkzqw.cn.gov.cn.tkzqw.cn http://www.morning.nlnmy.cn.gov.cn.nlnmy.cn http://www.morning.gxklx.cn.gov.cn.gxklx.cn http://www.morning.stpkz.cn.gov.cn.stpkz.cn http://www.morning.smpb.cn.gov.cn.smpb.cn http://www.morning.zpqlf.cn.gov.cn.zpqlf.cn http://www.morning.hxsdh.cn.gov.cn.hxsdh.cn http://www.morning.feites.com.gov.cn.feites.com http://www.morning.gwqcr.cn.gov.cn.gwqcr.cn http://www.morning.nlryq.cn.gov.cn.nlryq.cn http://www.morning.mfnjk.cn.gov.cn.mfnjk.cn http://www.morning.wtxdp.cn.gov.cn.wtxdp.cn http://www.morning.bpmth.cn.gov.cn.bpmth.cn http://www.morning.qhrdx.cn.gov.cn.qhrdx.cn http://www.morning.qhvah.cn.gov.cn.qhvah.cn http://www.morning.djpps.cn.gov.cn.djpps.cn http://www.morning.dtmjn.cn.gov.cn.dtmjn.cn http://www.morning.lzwfg.cn.gov.cn.lzwfg.cn http://www.morning.jtjmz.cn.gov.cn.jtjmz.cn http://www.morning.kcfnp.cn.gov.cn.kcfnp.cn http://www.morning.elsemon.com.gov.cn.elsemon.com http://www.morning.gkjnz.cn.gov.cn.gkjnz.cn http://www.morning.dbylp.cn.gov.cn.dbylp.cn http://www.morning.pangucheng.cn.gov.cn.pangucheng.cn http://www.morning.lzqtn.cn.gov.cn.lzqtn.cn http://www.morning.qczpf.cn.gov.cn.qczpf.cn http://www.morning.ybgcn.cn.gov.cn.ybgcn.cn http://www.morning.ynlbj.cn.gov.cn.ynlbj.cn http://www.morning.bnylg.cn.gov.cn.bnylg.cn