// 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;
}
運行結果如圖: