Windows多線程示例代碼

// thread.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include <Windows.h>
#include <vector>
#include <iostream>
#include <process.h>
using namespace std;

// 線程函數
unsigned int __stdcall thread1(LPVOID arg);	
unsigned int __stdcall thread2(LPVOID arg);

HANDLE					gMutex;			// 線程鎖
volatile bool			gStop;			// 結束狀態
vector<int>				gVecNumbers;	// 數組
int						gArgs;			// 線程參數
#define NUMBERS			8

int _tmain(int argc, _TCHAR* argv[])
{
	gMutex = CreateMutex(NULL, FALSE, "ThreadMutex");	// 創建互斥體
	gStop = false;
	HANDLE hThread = 0;
	unsigned int nThreadId = 0;
	vector<HANDLE> vecHandles;
	vector<unsigned (__stdcall*)(void *)> vecFuns;

	// 添加多個線程函數
	vecFuns.push_back(thread1);
	vecFuns.push_back(thread2);

	// 創建多個線程
	for (unsigned int i = 0; i < vecFuns.size(); i++)
	{
		WaitForSingleObject(gMutex, INFINITE);

		hThread = (HANDLE)_beginthreadex(NULL, 0, vecFuns[i], (void*)&gArgs, 
			CREATE_SUSPENDED, &nThreadId);
		ResumeThread(hThread);
		vecHandles.push_back(hThread);

		ReleaseMutex(gMutex);
	}

	// 等待線程結束
	for (unsigned int i = 0; i < vecHandles.size(); i++)
	{
		WaitForSingleObject(vecHandles[i], INFINITE);
	}

	getchar();
	return 0;
}

unsigned int __stdcall thread1(LPVOID arg)
{
	// 線程1向vector裏添加數據,添加完成後設置gStop爲true
	for (int i = 0; i < NUMBERS; i++)
	{
		WaitForSingleObject(gMutex, INFINITE);
		gVecNumbers.push_back(i);
		cout << "thread 1 add " << i << endl;

		if (i == NUMBERS - 1)
			gStop = true;
		ReleaseMutex(gMutex);
	}
	return 0;
}

unsigned int __stdcall thread2(LPVOID arg)
{
	// 線程2從vector裏刪除數據
	while (!gStop)
	{
		WaitForSingleObject(gMutex, INFINITE);
		if (gVecNumbers.size() > 0)
		{
			cout << "		thread 2 remove " << *gVecNumbers.begin() << endl;
			gVecNumbers.erase(gVecNumbers.begin());
		}
		ReleaseMutex(gMutex);
	}

	return 0;
}

運行結果如圖:

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章