// TestMoreNuclear.cpp : Defines the entry point for the console application.
//该程序目前共启动三个线程(线程的个数可以随意添加),用于共同操作一个整形数组,一个线程向数组内添加数据,另外两个向外拿数据。
#include "stdafx.h"
#include <windows.h>
#include <process.h> /*_beginthreadex()/_endthread()*/
#include <stdlib.h>
#define BUFFER_SIZE 99999999
int isStop = 0;
/
//数据链表
class DataList
{
public:
DataList();
~DataList();
public:
int *a;
int currentAddSize;
int currentGetSize;
public:
CRITICAL_SECTION pMutex; /* 锁 */
};
DataList::DataList()
{
a = (int*)malloc(BUFFER_SIZE);
memset(a, 0, BUFFER_SIZE);
currentAddSize = 0;
currentGetSize = 0;
InitializeCriticalSection(&pMutex); /* 线程锁初始化 */
}
DataList::~DataList()
{
free(a);
DeleteCriticalSection(&pMutex); /* 线程锁初始化 */
}
//
//获取数据链表
class DataGet
{
public:
DataGet();
~DataGet();
public:
DataList *pData;
void startService();
private:
void get();
static unsigned int WINAPI GET(LPVOID lParam);
private:
HANDLE hThread;
unsigned int uiThreadId;
};
DataGet::DataGet()
{
pData = NULL;
hThread = NULL;
}
DataGet::~DataGet()
{
}
void DataGet::startService()
{
hThread = (HANDLE)_beginthreadex(NULL, 0, GET, this, CREATE_SUSPENDED, &uiThreadId); /*GET 函数必须为静态 _stdcall 类型方可 */
if (NULL != hThread)
{
ResumeThread(hThread);
}
else
{
printf("Create Thread Failed \r\n");
}
}
unsigned int WINAPI DataGet::GET(LPVOID lParam)
{
((DataGet*)lParam)->get();
return 0;
}
void DataGet::get()
{
while (!isStop)
{
EnterCriticalSection(&pData->pMutex);
if (pData->currentGetSize < pData->currentAddSize)
{
printf("get %d value = %d \r\n", pData->currentGetSize, pData->a[pData->currentGetSize]);
pData->currentGetSize++;
}
else
{
printf("Array is Empty\r\n");
}
LeaveCriticalSection(&pData->pMutex);
Sleep(350);
}
_endthreadex(uiThreadId);
}
//
//添加数据
class DataAdd
{
public:
DataAdd();
~DataAdd();
public:
DataList *pData;
void startService();
private:
void add();
static unsigned int WINAPI ADD(LPVOID lParam);
private:
HANDLE hThread;
unsigned int uiThreadId;
};
DataAdd::DataAdd()
{
pData = NULL;
hThread = NULL;
}
DataAdd::~DataAdd()
{
}
void DataAdd::startService()
{
hThread = (HANDLE)_beginthreadex(NULL, 0, ADD, this, CREATE_SUSPENDED, &uiThreadId);
if (NULL != hThread)
{
ResumeThread(hThread);
}
else
{
printf("Create Add Thread Failed");
}
}
unsigned int WINAPI DataAdd::ADD(LPVOID lParam)
{
((DataAdd*)lParam)->add();
return 0;
}
void DataAdd::add()
{
int i = 0;
while(!isStop)
{
EnterCriticalSection(&pData->pMutex);
if (pData->currentAddSize < BUFFER_SIZE)
{
pData->a[pData->currentAddSize] = i;
printf("+++++++++++++++++++Add %d value = %d \r\n", pData->currentAddSize, i);
pData->currentAddSize++;
i++;
}
else
{
printf("Array is Full\r\n ");
}
LeaveCriticalSection(&pData->pMutex);
Sleep(200);
}
_endthreadex(uiThreadId);
}
int main(int argc, char* argv[])
{
DataList dataList;
DataGet dataGet;
dataGet.pData = &dataList;
DataGet dataGet2;
dataGet2.pData = &dataList;
DataAdd dataAdd;
dataAdd.pData = &dataList;
dataAdd.startService();
dataGet.startService();
dataGet2.startService();
char c = '0';
while (1)
{
c = getchar();
getchar(); //用于收取换行
if (c == 'q')
{
isStop = 1;
Sleep(1000);
break;
}
Sleep(1000);
}
return 0;
}
学习VC多线程时随手写的一个小例子
最新推荐文章于 2020-07-31 11:52:18 发布