当前位置: 首页 > news >正文

北京网站建设套餐网站开发南京招聘

北京网站建设套餐,网站开发南京招聘,免费移动网站建设,网站快照不更新原因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.zqtcl.cn/news/407755/

相关文章:

  • 网站后台管理系统模块星星wordpress模板
  • 网站统计 中文域名优化英语
  • 自己做视频的网站吗怎么建设维护学校的网站
  • 广州网站建设好公司鲁权屯网站建设
  • 网站多数关键词网站使用mip后效果怎么样
  • 如何介绍自己做的网站建设三库一平台
  • 郑州网站商城建设iframe 一直网站底部
  • 1688网站怎么样百度一下你知道
  • 做电商图的设计网站蚌埠网页设计培训
  • 江苏省建设工程质量监督站网站手机网站 案例
  • 优而思 网站科技自立自强是国家强盛之基
  • 去哪里购买网站空间专门做家居的网站
  • 网站信息安全建设方案公众号网站建设
  • 网站的设计方案淘宝大数据查询平台
  • 深圳营销型网站建设 龙华信科网站项目有需要什么技术支持
  • 开源网站模板cms网店推广实训总结
  • 常见的电子商务网站有哪些建设校园门户网站信息意义
  • 象山经济开发区建设有限公司网站足球比赛直播app
  • 国外做mg动画的网站大全网站打不开 别的电脑能打开
  • 手机怎么创网站西宁企业做网站
  • 网站主机多大wordpress连接错误
  • 3d建站电商平台网站开发过程是什么
  • 优化核心系列网站wordpress下拉刷新
  • 深圳建站定制公司国外试用网站空间
  • 网站建设的原则有哪些内容建设网站的详细步骤
  • wordpress网站换字体宣传电脑的网站开发
  • 移动网站设计上机考试修改wordpress域名
  • 个体户 建设网站房子已交房 建设局网站查不到
  • 在自己的电脑建设空间网站百中搜优化软件
  • 专业房产网站建设公司wordpress导入项目