GetProcessHeap() main() { HANDLE hHeap=HeapCreate(HEAP_GENERATE_EXCEPTIONS,0,0); }

#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
*/

 

posted @ 2018-03-19 14:40  sky20080101  阅读(243)  评论(0)    收藏  举报