`
frenchmay
  • 浏览: 232478 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

基于windows线程的并行线性查找

阅读更多
#include <Windows.h>
#include <process.h>
#include <stdio.h>
#include <time.h>

typedef struct{
	int * A;
	int num;
	int key;
	int threadID;
} sParam;

bool Done = FALSE;

#define NUM_THREADS 4

void linearSearch(int * A, int s, int e, int key, DWORD *position)
{
	int i;
	for (i = s; i < e; i++)
	{
		if (Done)
		{
			return;
		}

		if (A[i] == key)
		{
			*position = i;
			Done = TRUE;
			break;
		}
		Sleep(1);
	}
	return;
}

unsigned __stdcall pSearch(LPVOID pAvg){
	DWORD pos = -1;
	if (NULL != pAvg)
	{
		sParam * inArg = (sParam*)pAvg;
		int *A = inArg->A;
		int N = inArg->num;
		int key = inArg->key;
		int tNum = inArg->threadID;

		int start, end;

		start = ((float)N/NUM_THREADS) * tNum;
		end = ((float)N/NUM_THREADS) * (tNum + 1);
		if (tNum == (NUM_THREADS - 1))
		{
			end = N;
		}
		linearSearch(A, start, end, key, &pos);
		delete pAvg;
		pAvg = NULL;
	}
	ExitThread(pos);
}

#define  NUM_KEYS 100000

int main(int argc, char * argv[])
{
	int i, t,sKey = NUM_KEYS - 1, * positon = new int;

	time_t begin;
	time_t end;

	begin = time(NULL);

	HANDLE tHandles[NUM_THREADS];

	int * p = (int*)malloc(sizeof(int)*NUM_KEYS);

	for (t = 0; t < NUM_KEYS; t++)
	{
		*(p + t) = t ;
	}

	for (i = 0; i < NUM_THREADS; i++)
	{
		sParam * pAvg = new sParam;
		pAvg->A = p;

		pAvg->num = NUM_KEYS;
		pAvg->key = sKey;
		pAvg->threadID = i;
		tHandles[i] = (HANDLE)_beginthreadex(NULL, 0, pSearch, (LPVOID)pAvg, 0, NULL);
	}

	WaitForMultipleObjects(NUM_THREADS, tHandles, TRUE, INFINITE);

	for(i = 0; i < NUM_THREADS; i++){
		GetExitCodeThread(tHandles[i], (LPDWORD)positon);
		if (*positon != -1)
		{
			printf("key = %d found at index %d\n", sKey, *positon);
			break;
		}
	}

	end = time(NULL);

	printf("cost = %d\r\n", (end - begin));

	return 0;
}
 
分享到:
评论

相关推荐

    文件查找程序的源程序代码

    4. 多线程/并行查找:提高在大量文件中的查找速度。 5. 远程文件查找:集成云存储服务,查找网络上的文件。 6. 文件管理系统:结合查找功能,构建文件分类、整理、备份和分享的工具。 总之,理解并掌握文件查找程序...

    Intel_Visual_Fortran_Compiler_11.1.067_Windows_Downloadly.ir.rar

    3. **OpenMP支持**:集成对OpenMP并行编程模型的支持,使得开发者可以轻松地编写并行代码,利用多线程处理复杂计算任务,显著提升程序的并行执行效率。 4. **调试工具**:Intel Visual Fortran Compiler提供了强大...

    快速的全盘查找文件源码

    在实际应用中,我们还需要考虑性能优化策略,比如多线程并行查找、缓存最近查找结果、使用文件系统缓存等。此外,用户界面设计也很重要,例如实时更新查找进度、提供取消操作、错误处理等,都能提升用户体验。 现在...

    NTL for windows

    8. **多线程支持**:NTL库部分功能支持多线程,使得开发者可以利用多核处理器来加速计算,尤其在需要大量并行计算的场景下。 9. **文档和示例**:NTL库通常会包含详尽的文档和示例代码,帮助开发者快速理解和使用这...

    VC 快速查找文件的一个例子.rar

    6. **性能优化**:如果需要频繁查找,可以考虑缓存文件列表或利用多线程技术并行处理,进一步提高查找速度。 在源代码中,`codesc.net`可能是一个包含了实现以上步骤的源文件,具体细节需要查看源码才能了解。理解...

    当当网数据(1.1G)快速检索

    这表明项目的开发环境是基于Windows平台,且选择了开源的MinGW作为GCC的Windows版本。 综合以上信息,我们可以推测这个项目可能包含以下知识点: 1. **QT编程**:学习和使用QT库来创建GUI应用,包括控件布局、事件...

    c++builder数据结构算法

    在C++Builder中,常用算法有排序(如冒泡排序、选择排序、插入排序、快速排序、归并排序)、查找(如线性查找、二分查找)、图算法(如深度优先搜索、广度优先搜索)、动态规划等。排序算法用于对数据进行排序,选择...

    新版Android开发教程.rar

    ----------------------------...• 优化的图形库 包括定制的 2D 图形库, 3D 图形库基于 OpenGL ES 1.0 (硬件加速可选) • SQLite SQLite SQLite SQLite 用作结构化的数据存储 • 多媒体支持 包括常见的音频、视频和...

Global site tag (gtag.js) - Google Analytics