windows C++ 多任务并发执行设计

1、问题描述

如图:

(1)服务端负责下发任务;且每次下发一个任务,下发任务个数不固定(通过下发界面勾选下发),但总个数<=4个。

(2)客户端负责接收任务,接收任务后要循环执行,除非接收到停止指令后停止执行。

指令类型分为:

1)心跳指令——用于保活连接;

2)任务开始指令——用于开始执行任务;

3)任务中止指令——用于结束任务;

2、设计详解

(1)客户端要并发运行,且会调用相同接口传递不同参数实现,所以必须进行多线程同步。

线程数目由客户端Socket接收信息解析后而定,但总数目会<=4,未来可能会拓展。

所以,此处使用Semaphore信号量进行同步。

(2)相同代码段,为避免访问冲突,导致异常。需要使用“关键代码段”Critical Section进行互斥访问。

3、模拟代码

#include <stdio.h>
#include <process.h>
#include <windows.h>

long g_nNum = 0;
unsigned int __stdcall Fun(void *pPM);
const int g_iMaxThreadCnt = 4; //客户端线程个数

//信号量与关键段
HANDLE g_hThreadParam;
CRITICAL_SECTION g_csThreadCode;

unsigned int __stdcall Fun(void *pPM)
{
int nThreadNum = *(int *)pPM;
EnterCriticalSection(&g_csThreadCode);
while(1)
{
++g_nNum;
printf("线程No为%d 全局资源值为%d\n", nThreadNum, g_nNum);
ReleaseSemaphore(g_hThreadParam, 1, NULL);//信号量++
LeaveCriticalSection(&g_csThreadCode);

Sleep(1000);//模拟执行
}

return 0;
}

int TestMyThread()
{
//初始化信号量和关键段
//当前0个资源,最大允许1个同时访问
g_hThreadParam = CreateSemaphore(NULL, 0, 1, NULL);
InitializeCriticalSection(&g_csThreadCode);

HANDLE hThread[g_iMaxThreadCnt] = {NULL};
g_nNum = 0;
int i = 0;
while (i < g_iMaxThreadCnt)
{
hThread[i] = (HANDLE)_beginthreadex(NULL, 0, Fun, &i, 0, NULL);
WaitForSingleObject(g_hThreadParam, INFINITE);//等待信号量>0
++i;
}
//等待所有线程结束
WaitForMultipleObjects(g_iMaxThreadCnt, hThread, TRUE, INFINITE);

//销毁信号量和关键段
DeleteCriticalSection(&g_csThreadCode);
CloseHandle(g_hThreadParam);
for (i = 0; i < g_iMaxThreadCnt; i++)
{
CloseHandle(hThread[i]);
}
return 0;
}

4、小结

1)实际项目中要比这复杂很多,涉及socket数据接收与解析、循环执行等。

循环执行在线程内部实现比较好,这样不必循环调用线程,产生不必要的开销。

2)心中要先有框图内容,并思考如何执行,多测试以验证执行结果和预期、编码是否完全一致。

3)API经常不用会不熟悉,一定要MSDN清楚每个字段的切实含义,避免“自以为是”,影响大局。

2015-8-30 am11:58 整理于家中床前

作者:铭毅天下

转载请标明出处,原文地址:http://blog.csdn.net/laoyang360/article/details/48103473

如果感觉本文对您有帮助,请点击‘顶’支持一下,您的支持是我坚持写作最大的动力,谢谢!

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-07-31 10:00:35

windows C++ 多任务并发执行设计的相关文章

Shell脚本中的多任务并发执行

正常情况下,Shell脚本中的命令是串行执行的,当一条命令执行完才会执行接下来的命令.比如下面这段代码: #!/bin/bash for i in {1..10};do echo $i done echo "END" 执行结果: 1 2 3 4 5 6 7 8 9 10 END 可以看到,循环体中的"echo $i"命令是串行执行的.但是如果所执行的命令耗时比较长,这就会导致整个程序的执行时间非常长,甚至可能导致程序执行时卡在那里,长时间失去响应.比如我们需要完成这

Windows多线程多任务设计初步(转)

Windows多线程多任务设计初步 [前言:]当前流行的Windows操作系统,它能同时运行几个程序(独立运行的程序又称之为进程),对于同一个程序,它又可以分成若干个独立的执行流,我们称之为线程,线程提供了多任务处理的能力.用进程和线程的观点来研究软件是当今普遍采用的方法,进程和线程的概念的出现,对提高软件的并行性有着重要的意义.现在的应用软件无一不是多线程多任务处理,单线城的软件是不可想象的.因此掌握多线程多任务设计方法对每个程序员都是必需要掌握的.本文针对多线程技术在应用中经常遇到的问题,如

python 并发执行之多线程

正常情况下,我们在启动一个程序的时候.这个程序会先启动一个进程,启动之后这个进程会拉起来一个线程.这个线程再去处理事务.也就是说真正干活的是线程,进程这玩意只负责向系统要内存,要资源但是进程自己是不干活的.默认情况下只有一个进程只会拉起来一个线程. 多线程顾名思义,就是同样在一个进程的情况同时拉起来多个线程.上面说了,真正干活的是线程.进程与线程的关系就像是工厂和工人的关系.那么现在工厂还是一个,但是干活的工人多了.那么效率自然就提高了.因为只有一个进程,所以多线程在提高效率的同时,并没有向系统

AMETank v7.6 Windows 1CD 储油罐3D建模设计和分析

AMETank v7.6 Windows 1CD 储油罐3D建模设计和分析Intergraph TANK 2014 SP1 v6.00.01-ISO 1CD 储油罐的设计和分析AMETank是一款整合了AMTank和Etank2000的一体化软件,将AMTank的3D建模功能和出图能力整合到ETank2000中,使新的AMETank软件具有储罐3D建模,分析与评估,以及输出储罐构造图的能力.AMETank具有ETank的操作界面,支持ETank的所有计算功能.设计过程和在Etank2000一样,

使用JavaScript实现量化策略并发执行

本文代码和文章发在FMZ发明者比特币量化交易平台上: 使用JavaScript实现量化策略并发执行--封装Go函数 - 发明者量化?www.fmz.com 在实现量化策略时,很多情况下,并发执行可以降低延时提升效率.以对冲机器人为例,需要获取两个币的深度,顺序执行的代码如下: var depthA = exchanges[0].GetDepth() var depthB = exchanges[1].GetDepth() 请求一次rest API存在延时,假设是100ms,那么两次获取深度的时间

Linux-Shell-使用mkfifo实现多任务并发及并发数控制

默认的情况下,Shell脚本中的命令是串行执行的,必须等到前一条命令执行完后才执行接下来的命令,但是如果我有一大批的的命令需要执行,而且互相又没有影响的情况下(有影响的话就比较复杂了),那么就要使用命令的并发执行了. 如下: #!/bin/bash IPLIST=/home/meta/ipinfo/iplist for i in $(cat ${IPLIST} |grep -viE "^#|备机|ts"|awk '{print $1}') do ssh $i "cd ~/up

Windows编程 - 启动可执行(exe)程序 代码(C++)

启动可执行(exe)程序 代码(C++) 本文地址: http://blog.csdn.net/caroline_wendy 通过输入程序位置启动可执行(exe)程序, 使用windows的CreateProcess()函数, 即可. 示例是调用预先生产的可执行(exe)程序. 代码: /* * main.cpp * * Created on: 2014.06.08 * Author: Spike */ /*vs 2012*/ #include <iostream> #include <

Windows编程 - 终止可执行(exe)程序 代码(C++)

终止可执行(exe)程序 代码(C++) 本文地址: http://blog.csdn.net/caroline_wendy 终止可执行(exe)程序, 首先遍历进程, 找到进程名称对于的进程ID号, 然后根据进程ID, 终止进程. 示例代码: 包括遍历进程代码, 和关闭代码. 代码: /* * main.cpp * * Created on: 2014.06.08 * Author: Spike */ /*vs 2012*/ #include <iostream> #include <

windows php 5.5 执行exe 不是有效的win32程序

双击运行php-cgi.exe弹出对话框提示不是有效的win32应用程序.此为版本问题,PHP5.5版本 最低要运行于操作系统版本号最低要6.0 ,而WINDOWS 2003 系统为5.2 因此无法运行,故而提示此错误.WIN2003 下最高只能安装PHP5.4X的版本了. windows php 5.5 执行exe 不是有效的win32程序,布布扣,bubuko.com