并发程序设计

2023-11-01

ComputeTask.h:
void executeComputeTask();

ComputeTask.c:
#include "ComputeTask.h"
#include <stdio.h>
#include <stdint.h>

#define LOOP_SIZE (1024*1024*1024)

void executeComputeTask()
{
	size_t idx=0;
	size_t loopSize=LOOP_SIZE;
	
	for(idx=0;idx<loopSize;++idx)
	{
		//sum
	}
}

IOTask.h:
void executeIOTask();

IOTask.c:
#include "IOTask.h"
#include <fcntl.h>
#include <stdlib.h>
#include <unistd.h>
#include <stdio.h>
#include <string.h>

#define BUFFER_SIZE (1024*1024*1024)

const char fileName[]="IOFile";
void executeIOTask()
{
	char* fileBuf=(char*)malloc(BUFFER_SIZE);
	int fileFd=open(fileName,O_RDWR|O_CREAT,0644);
	if(-1==fileFd)
	{
		perror("Open File Error");
	}
	memset(fileBuf,97,BUFFER_SIZE);
	size_t writeSize = write(fileFd,fileBuf,BUFFER_SIZE);
	printf("write:%lu bytes to file:%s\n",writeSize,fileName);
	free(fileBuf);
	close(fileFd);
}

mainProg.c:
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <sys/time.h>
#include <unistd.h>

#include "ComputeTask.h"
#include "IOTask.h"

typedef enum OP{

	COMPUTE_TASK=1,
	IO_TASK
}OP_t;

typedef struct task{
	struct task *next;
	OP_t taskType;
}task_t;

int main(int argc, char *argv[])
{
	double computeTaskTimeElapse=0.0;
	double IOTaskTimeElapse=0.0;
	double totalTimeElapse=0.0;

	struct timeval computeTaskStartTime, computeTaskEndTime,IOTaskStartTime, IOTaskEndTime;
	
	pid_t fpid;
	task_t computeTask, ioTask;
	task_t* curTask = &computeTask;

	computeTask.taskType = COMPUTE_TASK;
	computeTask.next=&ioTask;
	ioTask.taskType=IO_TASK;
	ioTask.next=NULL;

	int parentProcess = 1;
	int childProcessNum = 0;

	while(NULL!=curTask)
	{
		if(curTask->taskType==IO_TASK)
			gettimeofday(&IOTaskStartTime,NULL);
		else
			gettimeofday(&computeTaskStartTime,NULL);
		fpid=fork();
		if(0==fpid)
		{//This is the child process
			parentProcess=0;
			break;
		}
		else if(-1==fpid)
		{
			printf("Generate child Process error!\n");
			exit(0);
		}

		wait(NULL);  //wait the child process finish execution
		
		if(COMPUTE_TASK==curTask->taskType)
			gettimeofday(&computeTaskEndTime,NULL);
		else
			gettimeofday(&IOTaskEndTime,NULL);
		printf("Generate child process with pid:%d\n",fpid);

		++childProcessNum;
		curTask=curTask->next;

	}

	if(parentProcess==0)
	{
		if(curTask->taskType==IO_TASK)
		{
			executeIOTask();
			printf("This is a IO task, pid:%d parent pid:%d\n",getpid(),getppid());//Print process ID and parent process ID
		}
		if(curTask->taskType==COMPUTE_TASK)
		{
			executeComputeTask();
			printf("This is a compute task, pid:%d parent pid:%d\n",getpid(),getppid());//Print process ID and parent process ID
		}
	}
	else
	{
		//Parent Process, we calculate the time for executing computing task and the time fo executing IO task
		computeTaskTimeElapse = (double)(computeTaskEndTime.tv_sec - computeTaskStartTime.tv_sec)*1000.0+(double)(computeTaskEndTime.tv_usec - computeTaskStartTime.tv_usec)/1000.0;
		IOTaskTimeElapse = (double)(IOTaskEndTime.tv_sec - IOTaskStartTime.tv_sec)*1000.0+(double)(IOTaskEndTime.tv_usec - IOTaskStartTime.tv_usec)/1000.0;
		totalTimeElapse = (double)(IOTaskEndTime.tv_sec-computeTaskStartTime.tv_sec)*1000.0+(double)(IOTaskEndTime.tv_usec-computeTaskStartTime.tv_usec)/1000.0;
		printf("Compute Task Time Consume:%fms, IO Task Time Consume: %fms, Total Time Consume:%fms \n", computeTaskTimeElapse,IOTaskTimeElapse,totalTimeElapse);
	}


}

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

并发程序设计 的相关文章

  • InvalidOperationException - 对象当前正在其他地方使用 - 红十字

    我有一个 C 桌面应用程序 其中我连续创建的一个线程从源 实际上是一台数码相机 获取图像并将其放在 GUI 中的面板 panel Image img 上 这必须是另一个线程 如它是控件的代码隐藏 该应用程序可以工作 但在某些机器上 我会在随
  • 每个托管线程是否都有自己对应的本机线程?

    我想知道是否在 Net 中创建托管线程 通过调用Thread Start 导致在后台创建一个本机线程 那么托管线程是否有对应的本机线程呢 如果是 当托管线程等待或睡眠时 是否意味着相应的本机线程也在等待或睡眠 是的 NET 线程映射到所有当
  • 在 C++ 中使用 matlab 结构(matlab 函数调用的返回值)(由 matlab 编译器生成的库)

    你好 我有一个相当简单的 matlab 函数 例如 function MYSTRUCT myfunc MYSTRUCT prop1 test MYSTRUCT prop2 foo MYSTRUCT prop3 42 end 我用 matla
  • 未提供参数时如何指定 C# System.Commandline 行为?

    在我的控制台应用程序中 当未提供控制台参数时 将执行我指定列表 在本例中为参数 3 的任何处理程序 调用该处理程序时 布尔参数设置为 false 但对我来说 根本不调用它更有意义 如何防止这种情况发生并显示帮助文本 using System
  • 在 C 中匹配二进制模式

    我目前正在开发一个 C 程序 需要解析一些定制的数据结构 幸运的是我知道它们是如何构造的 但是我不确定如何在 C 中实现我的解析器 每个结构的长度都是 32 位 并且每个结构都可以通过其二进制签名来识别 举个例子 有两个我感兴趣的特定结构
  • 单个对象的 Monogame XNA 变换矩阵?

    我读过一些解释 XNA Monogame 变换矩阵的教程 问题是这些矩阵应用于 SpriteBatch Begin matrix 这意味着所有 Draw 代码都将被转换 如何将变换矩阵应用于单个可绘制对象 就我而言 我想转换滚动背景 使其自
  • 如何创建包含 IPv4 地址的文本框? [复制]

    这个问题在这里已经有答案了 如何制作一个这样的文本框 我想所有的用户都见过这个并且知道它的功能 您可以使用带有 Mask 的 MaskedTestBox000 000 000 000 欲了解更多信息 请参阅文档 http msdn micr
  • 获取两个工作日之间的天数差异

    这听起来很简单 但我不明白其中的意义 那么获取两次之间的天数的最简单方法是什么DayOfWeeks当第一个是起点时 如果下一个工作日较早 则应考虑在下周 The DayOfWeek 枚举 http 20 20 5B1 5D 3a 20htt
  • 使用接口有什么好处?

    使用接口有什么用 我听说它用来代替多重继承 并且还可以用它来完成数据隐藏 还有其他优点吗 哪些地方使用了接口 程序员如何识别需要该接口 有什么区别explicit interface implementation and implicit
  • 如何使用 LINQ2SQL 连接两个不同上下文的表?

    我的应用程序中有 2 个数据上下文 不同的数据库 并且需要能够通过上下文 B 中的表的右连接来查询上下文 A 中的表 我该如何在 LINQ2SQL 中执行此操作 Why 我们正在使用 SaaS 产品来跟踪我们的时间 项目等 并希望向该产品发
  • 将 Word 文档另存为图像

    我正在使用下面的代码将 Word 文档转换为图像文件 但是图片显得太大 内容不适合 有没有办法渲染图片或将图片保存到合适的尺寸 private void btnConvert Click object sender EventArgs e
  • qdbusxml2cpp 未知类型

    在使用 qdbusxml2cpp 程序将以下 xml 转换为 Qt 类时 我收到此错误 qdbusxml2cpp c ObjectManager a ObjectManager ObjectManager cpp xml object ma
  • 在一个平台上,对于所有数据类型,所有数据指针的大小是否相同? [复制]

    这个问题在这里已经有答案了 Are char int long 甚至long long 大小相同 在给定平台上 不能保证它们的大小相同 尽管在我有使用经验的平台上它们通常是相同的 C 2011 在线草稿 http www open std
  • 使用自定义堆的类似 malloc 的函数

    如果我希望使用自定义预分配堆构造类似 malloc 的功能 那么 C 中最好的方法是什么 我的具体问题是 我有一个可映射 类似内存 的设备 已将其放入我的地址空间中 但我需要获得一种更灵活的方式来使用该内存来存储将随着时间的推移分配和释放的
  • C# 中的合并运算符?

    我想我记得看到过类似的东西 三元运算符 http msdn microsoft com en us library ty67wk28 28VS 80 29 aspx在 C 中 它只有两部分 如果变量值不为空 则返回变量值 如果为空 则返回默
  • C++ 函数重载类似转换

    我收到一个错误 指出两个重载具有相似的转换 我尝试了太多的事情 但没有任何帮助 这是那段代码 CString GetInput int numberOfInput BOOL clearBuffer FALSE UINT timeout IN
  • 按 Esc 按键关闭 Ajax Modal 弹出窗口

    我已经使用 Ajax 显示了一个面板弹出窗口 我要做的是当用户按 Esc 键时关闭该窗口 这可能吗 如果有人知道这一点或以前做过这一点 请帮助我 Thanks 通过以下链接 您可以通过按退出按钮轻松关闭窗口 http www codepro
  • 方法优化 - C#

    我开发了一种方法 允许我通过参数传入表 字符串 列数组 字符串 和值数组 对象 然后使用这些参数创建参数化查询 虽然它工作得很好 但代码的长度以及多个 for 循环散发出一种代码味道 特别是我觉得我用来在列和值之间插入逗号的方法可以用不同的
  • 无法接收 UDP Windows RT

    我正在为 Windows 8 RT 编写一个 Windows Store Metro Modern RT 应用程序 需要在端口 49030 上接收 UDP 数据包 但我似乎无法接收任何数据包 我已按照使用教程进行操作DatagramSock
  • 当从finally中抛出异常时,Catch块不会被评估

    出现这个问题的原因是之前在 NET 4 0 中运行的代码在 NET 4 5 中因未处理的异常而失败 部分原因是 try finallys 如果您想了解详细信息 请阅读更多内容微软连接 https connect microsoft com

随机推荐

  • 【docker问题】permission denied while trying to connect to the Docker daemon socket at unix

    permission denied while trying to connect to the Docker daemon socket at unix var run docker sock Get http 2Fvar 2Frun 2
  • Games101学习笔记一(渲染流程)

    文章目录 齐次坐标 Homogeneous Coordinates 3D转换矩阵 3D Transformations 3D 缩放 3D 平移 3D 旋转 Rodrigues Rotation Formula Rodrigues Rotat
  • missing line number attributes解决办法

    missing line number attributes解决办法 方法一 Window gt Preferences gt Java Compiler gt Add line number attributes to generated
  • xilinx ip 高斯金字塔down

    功能 1 单axi stream 接口输入 10bit raw输入 axis输出 10bit输出 2 使用xilinx hls 编写 3 配置寄存器有 pragma HLS INTERFACE s axilite port width pr
  • 企业级Python面试题(准备Python面试、期末考试的都可看看)

    一百七十个Python面试题 准备面试 期末考试的都可看看 Python面试题 上部分 1 为什么学习 Python 2 解释型和编译型语言的区别 3 简述下 Python 中的字符串 列表 元组和字典 4 简述上述数据类型的常用方法 5
  • MySQL必知必会 学习笔记 第十四章 使用子查询

    MySQL 4 1引入了子查询 任何SQL语句都是查询 但此术语一般指SELECT语句 有两张表 一张是语言表 一张是电影表 选出语言是英语的电影 SELECT title FROM film WHERE language id IN SE
  • 【百占百胜】-三创比赛,将form表单数据封装成对象使用ajax方式传到后台

    大家好 我是被白菜拱的猪 一个热爱学习废寝忘食头悬梁锥刺股 痴迷于girl的潇洒从容淡然coding handsome boy 解决了上一问题 这不又来一个问题 真是问题接着问题 问题无穷尽也 使用ajax将form表单数据封装成对象发送到
  • linux下 source ~/.bashrc文件修改后无效的原因

    linux下通过vim bashrc修改数据比如数据库连接 export CONN STRING postgres username password 127 0 0 1 db sslmode disbale 保存退出后 直接用source
  • GD32上SFUD万能Flash驱动移植

    GD32上SFUD万能Flash驱动移植 移植前提 下载源码 测试效果 移植过程 添加文件到工程目录 keil项目中添加如下文件到工程 设置头文件包含路径 修改sfud port c文件 修改sfud cfg h文件 添加获取初始化状态 可
  • MySQL语句备忘

    MySQL事务随时查看 打开事务随时查看 有效范围当前窗口 SET SESSION TRANSACTION ISOLATION LEVEL READ UNCOMMITTED SQLyog直接点击表在窗口查看即可 比较方便 Navicat需要
  • JavaScript正则表达式

    正则表达式大白话就是一个能判定你的输入内容是否符合设计者规定的一个式子 作用 1 测试字符串是否合规 被用来检测前端输入的字段是否符合要求 常见的场景是注册时输入账号 密码 邮箱等的测试 2 替换某确定的文本 通过js批量替换某个已存在的文
  • R语言学习笔记8

    15 概率 贝叶斯概率 基于当前情形的个人判断使用先验知识来给概率赋值 条件概率 一个事件在另一个发生的事件下发生概率 交集 并集 补集 随机变量 一个偶然的机或者随机出现特定结果的变量 概率分布 将随机变量与定义概率函数相联系是有意义的
  • 头条巨量快手广点通等平台APP&API回传事件注册激活-转化联调-API对接原理代码分析和功能实现

    2022年最新的头条巨量快手广点通等各推广平台APP API回传事件 转化联调注册激活 API对接原理代码分析和功能实现 在商户推广管理当中 经常碰到 需要将用户行为数据回传给推广平台 做转化追踪 事件回传 需要把用户行为数据回传给诸如巨量
  • argsort()函数

    a 6 4 5 b a argsort 1 2 0 意思是 a 1 lt a 2 lt a 0 解释如下 数组a排序后为a1 4 5 6 a argsort返回数组a1中的元素在原数组a中的索引 如何返回数组a中的元素在a1中的索引 2 0
  • LVGL笔记13–lv_led指示灯

    LVGL笔记13 lv led指示灯 LV LED控件就是一个简单的指示灯 在屏幕上绘制一个LED灯样式的图形 这个外形可以通过LV style来修改 通常设置为圆形或小矩形 led灯控件具有0 255级的可调亮度属性 设置为0时代表最暗
  • Python3.11教程4:异常处理

    文章目录 九 异常处理 9 1 异常堆栈跟踪 9 2 异常处理的基本语法 9 3 异常类及异常处理机制 9 4 自定义异常类 9 5 raise触发异常 及其与except的区别 9 6 异常链 9 7 处理多个不相关的异常 9 8 用注释
  • Web目录文件扫描程序(python)

    使用方法 首先找个网站 我们可以看到URL中有php后缀名 说明该网站为php网站 输入参数 URL 文件类型 线程数 即可扫出目录文件 验证一下 访问成功 代码 环境 pycharm python3 9 文件结构 dics文件夹下为各个后
  • 重庆三峡学院计算机英语期末考试,英语语言学试题B卷及答案(重庆三峡学院)

    语言学 英语语言学试题B卷及答案 重庆三峡学院 I Define the following linguistic terms 2 10 20 1 government 2 exocentric construction 3 complem
  • gdb之info/show命令

    一 gdb命令 相对于常见和常用的backtrace break watch step之类的指令来说 这两个都是相对比较小众的功能 只管来说 小众的功能就是使用的人比较少的功能 而使用的比较少的原因也可能是多方面的 一个可能的原因就是大部分
  • 并发程序设计

    ComputeTask h void executeComputeTask ComputeTask c include ComputeTask h include