windows多线程开发之并发线程程序研究

author author     2022-09-18     468

关键词:

做为一名分布式服务器开发人员,在服务器开发领域、多线程开发和并发编程方面有自己的心得和经验,愿意分享给同仁,今讨论下Windows下线程并发程序开发。


下面用用两个线程实现一个简单的数组排序,演示了线程的基本用法。


原理是:

为了节省执行时间而添加并行,把问题划分为几个小问题,并分配给几个线程(分而治之),把问题划分成若干更小的单元,更容易在实现中创建并行逻辑。同时,在并行中使用系统资源能优化应用程序并提高其运行速度。

#include "stdafx.h" 
#include <iostream>
#include <Windows.h>
#include <Winternl.h>
#include <tchar.h>
#include <winbase.h>
using namespace std;

#define THREADS_NUMBER 2
#define ELEMENTS_NUMBER 200
#define BLOCK_SIZE ELEMENTS_NUMBER / THREADS_NUMBER 
#define MAX_VALUE 1000

typedef struct _tagARRAYOBJECT 
{
	int* iArray;
	int iSize;
	int iThreadID; 
} ARRAYOBJECT, *PARRAYOBJECT;

DWORD WINAPI ThreadStart( LPVOID lpParameter);
void PrintArray( int* iArray, int iSize);
void MergeArrays(int* leftArray, int leftArrayLenght, int* rightArray, int rightArrayLenght, int* mergedArray);
int _tmain(int argc, _TCHAR* argv[])
{
	int iArray1[BLOCK_SIZE];
	int iArray2[BLOCK_SIZE];
	int iArray[ELEMENTS_NUMBER];

	for (int iIndex = 0; iIndex < BLOCK_SIZE; iIndex++)
	{
		iArray1[iIndex] = rand() % MAX_VALUE;
		iArray2[iIndex] = rand() % MAX_VALUE;
	}
	HANDLE hThreads[THREADS_NUMBER];

	ARRAYOBJECT pObject1 = { &(iArray1[0]), BLOCK_SIZE, 0 };
	hThreads[0] = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)ThreadStart,(LPVOID)& pObject1, 0, NULL); 
	
	ARRAYOBJECT pObject2 = { &(iArray2[0]), BLOCK_SIZE, 1 };
	hThreads[1] = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)ThreadStart, (LPVOID)& pObject2, 0, NULL);cout<<"Waiting execution..." << endl;
	
	WaitForMultipleObjects(THREADS_NUMBER, hThreads, TRUE, INFINITE); 
	MergeArrays(&iArray1[0], BLOCK_SIZE, &iArray2[0], BLOCK_SIZE, &iArray[0]);
	PrintArray(iArray, ELEMENTS_NUMBER);
	CloseHandle(hThreads[0]);
	CloseHandle(hThreads[1]);
	cout<< "Array sorted..." << endl;

	getchar();
	return 0;
} 
DWORD WINAPI ThreadStart(LPVOID lpParameter)
{
	PARRAYOBJECT pObject = (PARRAYOBJECT)lpParameter;
	int iTmp = 0;
	for (int iIndex = 0; iIndex < pObject->iSize; iIndex++)
	{
		for (int iEndIndex = pObject->iSize - 1; iEndIndex > iIndex; iEndIndex--) 
		{
			if (pObject->iArray[iEndIndex] < pObject->iArray[iIndex])
			{
				iTmp = pObject->iArray[iEndIndex];
				pObject->iArray[iEndIndex] = pObject->iArray[iIndex];
				pObject->iArray[iIndex] = iTmp;
			}
		}
	}
	return 0;
} 
void PrintArray(int* iArray, int iSize) 
{
	for (int iIndex = 0; iIndex < iSize; iIndex++) 
	{
		cout << " " << iArray[iIndex];
	}
	cout << endl; 
}
void MergeArrays(int* leftArray, int leftArrayLenght, int*  rightArray, int rightArrayLenght, int* mergedArray)
{
	int i = 0;
	int j = 0;
	int k = 0;
	while (i < leftArrayLenght && j < rightArrayLenght)
	{
		if (leftArray[i] < rightArray[j])
		{
			mergedArray[k] = leftArray[i];
			i++;
		}
		else
		{
			mergedArray[k] = rightArray[j];
			j++;
		}
		k++;
	}
	if (i >= leftArrayLenght)
	{
		while (j < rightArrayLenght)
		{
			mergedArray[k] = rightArray[j];
			j++;
			k++;
		}
	}
	if (j >= rightArrayLenght)
	{
		while (i < leftArrayLenght)
		{
			mergedArray[k] = leftArray[i];
			i++;
			k++;
		}
	}
}

运行结果:

技术分享

中间在编译运行的时候会遇到一些细节问题,特此说明:

出现错误:

 错误 C1189 #error:  "No Target Architecture"

设置如下即可:在_X86_

技术分享

技术分享


分布式开发,服务器开发,多线程开发,并发程序设计,任重而道远。

java多线程与并发模型之锁

这是一篇总结Java多线程开发的长文。文章是从Java创建之初就存在的synchronized关键字引入,对Java多线程和并发模型进行了探讨。希望通过此篇内容的解读能帮助Java开发者更好的理清Java并发编程的脉络。互联网上充斥着对Java多线... 查看详情

并发编程之多线程(代码片段)

一线程什么是线程?  程序的执行路线,线程是cpu上的的执行单位。传统举例:我们把操作系统比喻为一个工厂,进程就是这个工厂中的车间,线程是属于工厂中的流水线。进程和线程的关系?  1.进程中包含了运行程序需要... 查看详情

java多线程之并发编程三大核心问题

概述并发编程是Java语言的重要特性之一,它能使复杂的代码变得更简单,从而极大的简化复杂系统的开发。并发编程可以充分发挥多处理器系统的强大计算能力,随着处理器数量的持续增长,如何高效的并发变得越来越重要。... 查看详情

springboot开发之多线程理解单例研究线程池学习和项目运行问题解决

springboot多线程问题和单例相关研究一直以来对springboot中的多线程和并发的实际应用没有进行一个深入的了解,今天对相关的知识进行了学习和验证(基于springboot2.x)。总结如下:controller、service、repository默认都是单例形式... 查看详情

并发编程之多线程基础篇及面试

线程与进程区别每个正在系统上运行的程序都是一个进程。每个进程包含一到多个线程。线程是一组指令的集合,或者是程序的特殊段,它可以在程序里独立执行。也可以把它理解为代码运行的上下文。所以线程基本上是轻量级... 查看详情

面试之多线程通信

...不管你是新程序员还是老手,你一定在面试中遇到过有关线程的问题。Java语言一个重要的特点就是内置了对并发的支持,让Java大受企业和程序员的欢迎。大多数待遇丰厚的Java开发职位都要求开发者精通多线程技术并且有丰富的... 查看详情

java高级之多线程

1.1,多线程的作用:  *线程是程序执行的一条路径,一个进程中可以包含多条线程  *多线程并发执行可以提高程序的效率,可以同时完成多项工作1.2,多线程的应用场景:  *红蜘蛛同时共享屏幕给多个电脑   *迅雷开启多条... 查看详情

多线程编程-之并发编程:阻塞队列

...urrentHashMap、CopyOnWriteArrayList),这些工具都为我们编写多线程程序提供了很大的方便。今天我们来讨论另外一类容器:阻塞队列。  在前面我们接触的队列都是非阻塞队列,比如PriorityQueue、LinkedList(LinkedList是双向链表,它实... 查看详情

多线程之synchronized

java的堆中信息是共享的,线程是把会堆中信息拷贝,对副本进行操作,操作完再同步堆中的信息,而堆中的信息可能被b线程修改了,a线程的副本还是未修改前的,此时就引发多并发问题。解决多并发的问题就是通过枷锁,使原... 查看详情

多线程之并发编程

  学习链接Java并发教程 查看详情

架构师必备之面试题整理——多线程并发技术要点!

一、概念什么是线程一个线程要执行任务,必须得有线程一个进程(程序)的所有任务都在线程中执行的一个线程执行任务是串行的,也就是说一个线程,同一时间内,只能执行一个任务多线程原理同一时间,CPU只能处理1条线程,只有一条... 查看详情

golang之并发篇

进程和线程A。进程是程序在操作系统中的一次执行过程,系统进行资源分配和调度的一个独立单位。B。线程是进程的一个执行实体,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位。C。一个进程可以创建... 查看详情

高并发多线程安全之信号量线程组守护线程线程栅栏等的分析(代码片段)

高并发多线程安全之原子性问题、CAS机制及问题解决方案多线程编程之java内存模型(JMM)与可见性问题前言前两篇文章主要分析的是线程安全中java内存模型;以及常见的线程安全三大问题:原子性、可见性、有序性问题这... 查看详情

多线程编程-之并发编程:同步容器

为了方便编写出线程安全的程序,Java里面提供了一些线程安全类和并发工具,比如:同步容器、并发容器、阻塞队列、Synchronizer。同时说说List,Set,Map之间的区别. 自动扩展的数组:List 重复的数组:set 自动排序的组数:TreeSe... 查看详情

并发编程之多线程

一、并发编程之多线程1、线程简单介绍进程是资源单位,把所有资源集中到一起,而线程是执行单位,真正执行的是线程每个进程都有一个地址空间,而且默认就有一个控制线程多线程:在一个进程中存在多个控制线程,多个... 查看详情

java面试之多线程

...个队列和一台咖啡机。并行=两个队列和两台咖啡机。36.线程和进程的区别?一个程序下至少有一个进程,一个进程下至少有一个线程,一个进程下也可以有多个线程来增加程序的执行速度。37.守护线程是什么?守护线程是运行... 查看详情

java面试之多线程

...个队列和一台咖啡机。并行=两个队列和两台咖啡机。36.线程和进程的区别?一个程序下至少有一个进程,一个进程下至少有一个线程,一个进程下也可以有多个线程来增加程序的执行速度。37.守护线程是什么?守护线程是运行... 查看详情

java并发编程之线程安全线程通信

Java多线程开发中最重要的一点就是线程安全的实现了。所谓Java线程安全,可以简单理解为当多个线程访问同一个共享资源时产生的数据不一致问题。为此,Java提供了一系列方法来解决线程安全问题。synchronizedsynchronized用于同步... 查看详情