本例子是《VC++Windows多线程实战图片编辑器视频课程》的学习笔记。
定义一个大小为1000 * 1000 * 1000的数组,分别用单线程的方法和多线程的方法给数组赋值,并计算两种方法的耗时。
_beginthread函数用于创建线程;
_endthread函数用于结束线程;
WaitForSingleObject函数等待线程结束。
使用c++类对线程进行封装。
XThread.h
#pragma once
class XThread
{
public:
bool Start();//创建线程并判断线程是否创建成功
void Wait();//等待线程结束函数
virtual void Main() = 0;//纯虚函数
XThread();
virtual ~XThread();
private:
unsigned int th = 0;//线程句柄
};
XThread.cpp
#include "XThread.h"
#include <process.h>
#include <Windows.h>
static void ThreadMain(void *para)
{
XThread *th = (XThread *)para;
th->Main();
_endthread();
}
bool XThread::Start()
{
th = _beginthread(ThreadMain, 0, this);//保存线程句柄
if(((int)th) <= 0) {
return false;
}
return true;
}
void XThread::Wait()
{
WaitForSingleObject((HANDLE)th, INFINITE);
}
XThread::XThread()
{
}
XThread::~XThread()
{
}
# main.cpp
#include <iostream>
#include <Windows.h>
#include "XThread.h"
using namespace std;
static char *arr = NULL;
class MyThread :public XThread
{
public:
int begin = 0;
int end = 0;
void Main()//每个线程对begin——end区间的数组赋值
{
for (int i = begin; i <= end; i++)
{
arr[i] = i;
}
}
};
int main()
{
int size = 1000 * 1000 * 1000;
arr = new char[size];
int tsize = 4;//设定线程数
MyThread *ths = new MyThread[tsize];
/*计算单个线程的耗时*/
long long start = GetTickCount();
for (int i = 0; i < size; i++)
{
arr[i] = i;
}
long long end = GetTickCount();
cout << "单线程耗时 ms = " << end - start <<"ms"<< endl;
/*计算四个线程的耗时*/
long long start_thread = GetTickCount();
for (int i = 0; i < tsize; i++)
{
ths[i].begin = i*(size / tsize);//起始计数值
ths[i].end = ths[i].begin + (size / tsize);//结束计数值
if (ths[i].end >= size) {
ths[i].end = size - 1;
}
ths[i].Start();
}
for (int i = 0; i < tsize; i++)//等待每个线程结束
{
ths[i].Wait();
}
long long end_thread = GetTickCount();
cout << "四线程耗时 ms = " << end_thread - start_thread <<"ms"<< endl;
getchar();
}