#include <Windows.h>
#include <process.h>
#include <stdio.h>
#include <time.h>
#define NUM_THREADS 4
int N = 10000, *A;
int intTotals[NUM_THREADS], outTotals[NUM_THREADS];
HANDLE doneStep1[NUM_THREADS];
HANDLE doneStep2;
unsigned __stdcall prefixScan(LPVOID pArg)
{
if(NULL != pArg)
{
int tNum = *((int*)pArg);
int start, end, i;
int lPrefixTotal;
free(pArg);
pArg = NULL;
start = (N/NUM_THREADS)*tNum;
end = (N/NUM_THREADS)*(tNum +1);
if (tNum == (NUM_THREADS - 1))
{
end = N;
}
for (i = start + 1; i < end; i++)
{
// printf(" %d, %d\r\n", A[i-1],A[i]);
A[i] = A[i-1] + A[i];
Sleep(1);
}
intTotals[tNum] = A[end - 1];
// printf("sub = %d, from %d to %d result = %d\r\n", tNum, start, end, intTotals[tNum]);
SetEvent(doneStep1[tNum]);
WaitForSingleObject(doneStep2, INFINITE);
lPrefixTotal = outTotals[tNum];
for (i = start; i < end; i++)
{
A[i] = lPrefixTotal + A[i];
}
}
return 0;
}
int main(int argc, char * argv[])
{
int i, j;
HANDLE tHandles[NUM_THREADS];
time_t begin;
time_t end;
begin = time(NULL);
A = (int*)malloc(sizeof(int)*N);
int * p = A;
for (i = 0; i < N; i++)
{
(*p++) = i;
}
for (i = 0; i < NUM_THREADS; i++)
{
doneStep1[i] = CreateEvent(NULL, TRUE, FALSE, NULL);
}
doneStep2 = CreateEvent(NULL, TRUE, FALSE, NULL);
for (i = 0; i < NUM_THREADS; i++)
{
int *tnum = new int;
*tnum = i;
tHandles[i] = (HANDLE)_beginthreadex(NULL, 0, prefixScan, (LPVOID)tnum, 0, NULL);
}
WaitForMultipleObjects(NUM_THREADS, doneStep1, TRUE, INFINITE);
outTotals[0] = 0;
for (j = 1; j < NUM_THREADS; j++)
{
outTotals[j] = outTotals[j - 1] + intTotals[j -1];
}
SetEvent(doneStep2);
WaitForMultipleObjects(NUM_THREADS, tHandles, TRUE, INFINITE);
end = time(NULL);
printf("total = %ld cost = %d\r\n", outTotals[NUM_THREADS -1], (end - begin));
if(NULL != A)
{
free(A);
A = NULL;
}
return 0;
}
分享到:
相关推荐
计算机高级体系结构 基于多线程并行程序优化 编写C语言程序,实现矩阵相乘,使用多线程并行程序的设计方法
多线程并行执行,然后汇总结果、多线程并行执行,汇总结果。 MultiThread,ResultVo> multiThread = new MultiThread,ResultVo>(threadList){ @Override public List<ResultVo> outExecute(int currentThread...
提出一种基于并行强化学习的建筑节能方法,该方法结合多线程技术和经验回放方法提出一个多线程并行强化学习算法框架,其新颖点在于:在经验回放过程中引入自模拟度量方法,通过计算样本之间的距离,选取低相似度的...
针对数据挖掘中经典的Apriori算法在计算频繁项目集时需消耗大量的时间缺点,文中利用多线程并行计算的特点,提出了基于线程并行计算的Apriori算法,该算法是将统计候选项目个数的任务交给多线程来执行,从而达到减少...
基于Java多线程的并行计算技术研究及应用
能够利用多线程实现并行运算,并获得良好得效果,能够很好得利用多线程实现查找运算
多线程并行执行,汇总结果、多线程并行执行,汇总结果
基于微内核的文件服务器的多线程并行化设计.pdf
关于多核系统的多线程并行计算分析,比较了各类编程语言对并行计算的支持情况
Windows环境下河网水流多线程并行计算研究
很好的OpenMP多线程并行编程资料。
C#多线程并行管理,通过Task实现,可对单个任务进行暂停,继续以及停止等操作,每个任务均有单独的进度条显示 同时执行的任务个数可以自行设置
本方法的执行基于统一计算架构(CUDA), 使用大量的GPU线程并行处理各个粒子的搜索过程来加速整个粒子群的收敛速度。程序充分使用CUDA自带的各种数学计算库, 从而保证了程序的稳定性和易写性。通过对多个基准优化...
基于多线程和SOCKET聊天室,里面是一个例子,是基于C#的WINFORM开发的
有助于多线程的开发和理解,程序有注释便于理解,可以尝试以此为基础二次开发 学习开发属于自己的聊天室程序,学习多线程的基础。。。
多线程和并行程序设计思路 区别以及代码实现..............
Windows线程Windows线程
基于多线程的端口扫描器,包含源代码以及分析
windows 下的一个基于多线程的程序实例 mfc实现
先进软件测试技术线程间通信求和逆序源代码