Pthreads程序实现任务队列

主线程启动用户指定数量的线程,这些线程进入条件等待状态。
主线程生成一些任务(一定计算量),每生成一个新的任务,就用条件变量唤醒一个线程,当这个唤醒线程执行完任务时,回到条件等待状态。
当主线程生成完所有任务,设置全局变量表示再没有要生成的任务了,并用一个广播唤醒所有线程。为了清晰起见,建议任务采用链表操作。

#include <iostream>
#include <stdlib.h>
#include <pthread.h>
using namespace std;
const int N=1e4,N1=1e6;
struct Node {int id;int a[N1],b[N1];Node* next;
};
struct Queue {Node* front;Node* tail;
};
int InitQueue(Queue* T);
int Add(Queue* T, int e);
int DoTask(Queue* T, int* ep);
int thread_count, finished = 0;
pthread_mutex_t mutex,actprint;
pthread_cond_t cond;
void* task(void* rank);
Queue Q;
int main(int argc, char* argv[])
{   srand(0);InitQueue(&Q);pthread_t *thread_handles;thread_count = strtol(argv[1], NULL, 10);//从命令行读取线程数thread_handles = new pthread_t[thread_count];//分配长度pthread_mutex_init(&mutex, NULL);pthread_mutex_init(&actprint, NULL);pthread_cond_init(&cond, NULL);int n;printf("Please input the task number:");cin>>n;for (int i = 0; i < thread_count; i++)pthread_create(&thread_handles[i], NULL, task, (void*)i);for (int i = 0; i < n; i++) {pthread_mutex_lock(&mutex);Add(&Q, i);pthread_cond_signal(&cond);pthread_mutex_unlock(&mutex);}finished = 1;pthread_cond_broadcast(&cond);for (int i = 0; i < thread_count; i++)pthread_join(thread_handles[i], NULL);pthread_mutex_destroy(&mutex);pthread_mutex_destroy(&actprint);pthread_cond_destroy(&cond);free(thread_handles);return 0;
}
int InitQueue(Queue* T) {T->front = (Node*)malloc(sizeof(Node));T->tail = T->front;T->front->id = 0;T->front->next = NULL;return 0;
}
int Add(Queue* T, int e) {Node* newnode = (Node*)malloc(sizeof(Node));newnode->id = e;newnode->next = 0;int t,k=0;for(int i=0;i<N1;i++){t=rand()%N;newnode->a[k++]=t;}k=0;for(int i=0;i<N;i++){t=rand()%N;newnode->b[k++]=t;}T->tail->next = newnode;T->tail = newnode;return 0;
}
int DoTask(Queue* T, int* e) {Node* dest;if (T->tail == T->front)return 0;//队列中已经没有任务dest = T->front->next;//从头取出一个任务if (dest == 0) return 0;for(int i=0;i<N1;i++){//做任务dest->a[i]=dest->a[i]*dest->b[i];}*e = dest->id;T->front->next = dest->next;free(dest);return 0;
}
void* task(void* rank) {long long my_rank = (long long)rank;pthread_mutex_lock(&actprint);cout<<"process "<<my_rank<<" has been activated"<<endl;pthread_mutex_unlock(&actprint);int my_task;Node** p = &(Q.front->next);while (1) {pthread_mutex_lock(&mutex);if (finished) {if (*p == NULL) {pthread_mutex_unlock(&mutex);break;}DoTask(&Q, &my_task);pthread_mutex_unlock(&mutex);printf("Thread %ld: Task no.%d\n", my_rank, my_task);}else {while(pthread_cond_wait(&cond, &mutex)!=0);DoTask(&Q, &my_task);pthread_mutex_unlock(&mutex);printf("Thread %ld: Task no.%d\n", my_rank, my_task);}}
}

参考资料
Pthreads实现任务队列

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/4884.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ThreeJS打造自己的人物

hello&#xff0c;大家好&#xff0c;我是better&#xff0c;今天为大家分享如何使用Three打造属于自己的3D人物模型。 人物建模 当下有很多人物建模的网站&#xff0c;这里给大家分享的 Ready Player Me - Create a Full-Body 3D Avatar From a Photo 前往这个网址&#xff…

C#List转IList方法

最近工作中使用到了C#的List和IList。 这里参考百度上的资料&#xff0c;总结一下。 IList使用命名空间&#xff1a; using System.Collections; List<T>类:表示可通过索引访问的对象的强类型列表&#xff0c;提供用于对列表进行搜索、排序和操作的方法。 IList<T&…

​​Layui之用户管理实例(对数据的增删改查)

目录 ​编辑一、R工具介绍&#xff08;&#xff09; ​编辑二、数据表的增删改查 ​编辑2.1我们先得从查询数据库的语句入手 2.2优化dao类 2.4UserAction类 2.5前台的页面实现增删改查操作 2.6 userManage页面JS 2.7user新增、修改iframe层js 前言 上一篇我分享了…

试玩python的web框架 flask、fastapi、tornado、django

文章目录 一、Flask入门案例 [官网](https://flask.net.cn/quickstart.html) [其它参考](https://zhuanlan.zhihu.com/p/104273184?utm_id0)二、FastAPI入门案例 [官网](https://fastapi.tiangolo.com/zh/) [w3cschool教程](https://www.w3cschool.cn/fastapi/fastapi-feature…

无涯教程-Javascript - 运算符

让无涯教程用一个简单的表达式 4 59 。这里的4和5称为操作数&#xff0c;" "称为运算符&#xff0c;JavaScript支持以下类型的运算符。 算术运算符比较运算符逻辑运算符赋值运算符三元)运算符 算术运算符 JavaScript支持以下算术运算符&#xff0c;假设变量A10&a…

[RocketMQ] Broker CommitLogDispatcher 异步构建ConsumeQueue和IndexFile源码解析 (十四)

CommitLogDispatcherBuildConsumeQueue: 异步构建ConsumerQueue。CommitLogDispatcherBuildIndex: 异步构建IndexFile。 文章目录 1.CommitLogDispatcherBuildConsumeQueue构建ConsumeQueue1.1 putMessagePositionInfo写入消息位置信息1.2 findConsumeQueue查找ConsumeQueue1.2…

go初识iris框架(二) - get,post请求和数据格式

继初步了解iris后 文章目录 获取url路径获取数据get请求post请求获取JSON数据格式JSON返回值获取XML数据格式XML返回值 获取url路径 package mainimport "github.com/kataras/iris/v12"func main(){app : iris.New()app.Get("/hello",func(ctx iris.Conte…

部分安卓端ncnn模型推理输出数据存在大量-nan和nan的问题

原文issue链接&#xff1a;部分安卓端ncnn模型推理输出数据存在大量-nan的问题 Issue #3607 Tencent/ncnn (github.com) 问题描述 onnx、ncnn模型在pc端推理输出结果正确且基本一致&#xff0c;在部分安卓设备上使用同一模型和输入的推理输出数据正常&#xff0c;另一部分安…

Redis报错-CROSSSLOT keys in request don‘t hash in the same slot

背景 问题涉及&#xff1a;spring security、spring session、redis 问题描述 springbootspringsecurityspringsessionantd 登录功能的时候&#xff0c;在源码中使用到了redis的rename命令&#xff08;如下图所示&#xff09; 在这里就会报错 CROSSSLOT keys in request d…

基于小波哈尔法(WHM)的一维非线性IVP测试问题的求解(Matlab代码实现)

&#x1f4a5;1 概述 小波哈尔法&#xff08;WHM&#xff09;是一种求解一维非线性初值问题&#xff08;IVP&#xff09;的数值方法。它基于小波分析的思想&#xff0c;通过将原始问题转化为小波空间中的线性问题&#xff0c;然后进行求解。以下是一维非线性IVP测试问题的求解…

MacOS 便笺Stickies数据恢复

在MacOS上&#xff0c;如果便笺数据丢了&#xff1a; 1、可以去时间机器备份的以下目录寻找&#xff0c;之前所有的便笺&#xff0c;都以rtfd文件的形式存在这下面。 最新备份/用户/Frank(这里是你的用户名)/Library/Containers/com.apple.Stickies/Data/Library/Stickies 2…

守护数智未来,开源网安受邀参加2023OWASP北京论坛

2023年7月14日&#xff0c;OWASP中国与网安加社区联合举办的“2023OWASP中国北京安全技术论坛”在北京圆满召开&#xff0c;开源网安受邀参加本次论坛并分享“软件供应链安全治理实践”。 本次“2023OWASP中国北京安全技术论坛”是OWASP中国北京地区年度重要活动之一&#xff…

【Hive实战】Hive的事务表

Hive Transactions 在升级到Hive 3之前&#xff0c;需要把在事务表上Major Compaction。主要是为了合并掉增量文件。更准确地说&#xff0c;自上次Major Compaction以来在其上执行过任何更新/删除/合并语句的任何分区都必须进行另一次Major Compaction。在 Hive 升级到 Hive 3 …

Vue+axios 使用CancelToken多次发送请求取消前面所有正在pendding的请求

需求&#xff1a; 项目中 折线图数据是循环调用的&#xff0c;此时勾选一个设备&#xff0c; 会出现多条线。 原因 折线图数据一进来接口循环在调用&#xff0c;勾选设备时&#xff0c;循环调用的接口有的处于pedding状态 &#xff0c;有的还在加载中&#xff0c;这就导致勾…

【PDFBox】PDFBox操作PDF文档之读取指定页面文本内容、读取所有页面文本内容、根据模板文件生成PDF文档

这篇文章&#xff0c;主要介绍PDFBox操作PDF文档之读取指定页面文本内容、读取所有页面文本内容、根据模板文件生成PDF文档。 目录 一、PDFBox操作文本 1.1、读取所有页面文本内容 1.2、读取指定页面文本内容 1.3、写入文本内容 1.4、替换文本内容 &#xff08;1&#xf…

如何在 Endless OS 上安装 ONLYOFFICE 桌面编辑器

ONLYOFFICE 桌面编辑器是一款基于依据 AGPL v.3 许可进行分发的开源办公套件。使用这款应用&#xff0c;您无需保持网络连接状态即可处理存储在计算机上的文档。本指南会向您介绍&#xff0c;如何在 Endless OS 上安装 ONLYOFFICE 桌面编辑器。 ONLYOFFICE 桌面版是什么 ONLYO…

Spring Boot进阶(55):SpringBoot之集成MongoDB及实战使用 | 超级详细,建议收藏

1. 前言&#x1f525; 前几期我们有介绍Mysql、Redis等数据库介绍及实战演示&#xff0c;对基本的数据存放有很好的共性&#xff0c;但是如果说遇到大面积的xml、Json、bson等格式文档数据存放&#xff0c;以上数据库并非是最优选择&#xff0c;最优选择是Mongodb数据库。 那么…

如何将jar 包下载到自定义maven仓库

下载命令 mvn install:install-file -Dfileartifactid-version.jar -DgroupIdgroupid -DartifactIdartifactid -Dversionversion -Dpackagingjar -DlocalRepositoryPath. -DcreateChecksumtrue参数解释 在上述命令中&#xff0c;需要替换以下参数&#xff1a; artifactid-vers…

HTTP原理解析-超详细

作者&#xff1a;20岁爱吃必胜客&#xff08;坤制作人&#xff09;&#xff0c;近十年开发经验, 跨域学习者&#xff0c;目前于海外某世界知名高校就读计算机相关专业。荣誉&#xff1a;阿里云博客专家认证、腾讯开发者社区优质创作者&#xff0c;在CTF省赛校赛多次取得好成绩。…

《刷题2》场景模拟

目录 1. C语言部分 1.1. 关键字static有什么用途? 1.2. 如何引用一个已经定义过的全局变量? 1.3. 设有以下说明和定义&#xff1a; 1.4. 写出float x 与“零值”比较的if语句 1.5. 对于一个频繁使用的短小函数,在C语言中应用什么实现,在C中应用什么实现? 1.6. 什么是…