#include <process.h>
#include <windows.h>
#include <queue>
#include <stdio.h>
#include <iostream>
using namespace std;
DWORD WINAPI ThreadWrite(LPVOID lParam);
DWORD WINAPI ThreadRead(LPVOID lParam);
queue<char *> Buffer;
HANDLE m_hMutexBuffer;
HANDLE m_hEventBuffer;
HANDLE hHeap;
PBYTE HeapAllocMem(HANDLE hHeap,int nHeapSize = 1024)
{
PBYTE pNewHeap = (PBYTE) ::HeapAlloc(hHeap/*GetProcessHeap()*/, 0, nHeapSize);
return pNewHeap;
}
BOOL HeapFreeMem (HANDLE hHeap,PBYTE pNewHeap)
{
//释放内存
BOOL bRes = ::HeapFree(hHeap/*GetProcessHeap()*/, 0, pNewHeap);
return bRes;
}
void main()
{
hHeap=HeapCreate(HEAP_GENERATE_EXCEPTIONS,0,0);
//
m_hMutexBuffer = CreateMutex(NULL, FALSE, NULL);
ReleaseMutex(m_hMutexBuffer);
m_hEventBuffer = CreateEvent(NULL, TRUE, FALSE, NULL);
HANDLE m_hThreadWrite = CreateThread(NULL, 0, ThreadWrite, NULL, 0, 0);
HANDLE m_hThreadRead = CreateThread(NULL, 0, ThreadRead, NULL, 0, 0);
HANDLE HandleList[2];
HandleList[0] = m_hThreadWrite;
HandleList[1] = m_hThreadRead;
WaitForMultipleObjects(2, HandleList, TRUE, INFINITE);
// Destroy the heap
BOOL flag = HeapDestroy(hHeap);
if (!flag)
{
cout << "HeapDestroy failed with error: " << GetLastError() << endl;
return ;
}
}
DWORD WINAPI ThreadWrite(LPVOID lParam)
{
if (WAIT_OBJECT_0 == WaitForSingleObject(m_hMutexBuffer, 100))
{
//char *Item = new char[20];
//
char *Item = (char*)HeapAllocMem(hHeap,20);
strcpy(Item, "Hello World!");
Buffer.push(Item);
ReleaseMutex(m_hMutexBuffer);
printf("ThreadWrite: 0x%08x\n", Item);
printf("ThreadWrite: 0x%08x\n", &Item);
SetEvent(m_hEventBuffer);
Sleep(10);
}
return 0;
}
DWORD WINAPI ThreadRead(LPVOID lParam)
{
if (WAIT_OBJECT_0 ==WaitForSingleObject(m_hEventBuffer, INFINITE))
{
if (WAIT_OBJECT_0 == WaitForSingleObject(m_hMutexBuffer, 100))
{
char * _Item = Buffer.front();
Buffer.pop();
if (Buffer.empty())
{
ResetEvent(m_hEventBuffer);
}
ReleaseMutex(m_hMutexBuffer);
printf("ThreadRead: %s\n", _Item);
printf("ThreadRead: 0x%08x\n", _Item);
printf("ThreadRead: 0x%08x\n", &_Item);
Sleep(10);
//delete [] _Item;
HeapFreeMem(hHeap,(PBYTE)_Item);
_Item = NULL;
}
}
return 0;
}
/*
ThreadWrite: 0x018b07d0
ThreadWrite: 0x01a6ff78
ThreadRead: Hello World!
ThreadRead: 0x018b07d0
ThreadRead: 0x01c6ff78
Press any key to continue
*/