我有两个函数,一个套接字接受函数,将接收到的数据写入内存缓冲区。另外一个函数在读取并修改同样的内存缓冲,如何实现共享内存缓冲,而不产生冲突。我的代码简略如下:
void CClientSocket::OnReceive(int nErrorCode) 
{
    //......
    //读套节子数据,写入缓冲
    iRead = pClientSocket->Receive(g_lpBuf,0x8fff,0);
    pMYView->TTYGetInfoReceived(this);
    //......
}void CMYView::TTYGetInfoReceived(CClientSocket *pClientSocket)
{
    char lpBuf[0x1000];
    //下面的代码将修改内存缓冲区g_lpBuf
    //.........
}我希望数据不断的由套节子读入,写到内存缓冲,又不断的被保存到文件中。

解决方案 »

  1.   

    GOOGLE搜索一下 多线程同步
      

  2.   

    要简单的话就用个临界区吧
    #include <afxmt.h>
    class CClientSocket
    {
    ...
    //增加成员变量
    CCriticalSection  m_cs;
    };
    void CClientSocket::OnReceive(int nErrorCode) 
    {
        //......
        //读套节子数据,写入缓冲
        m_cs.Lock();
        iRead = pClientSocket->Receive(g_lpBuf,0x8fff,0);
        m_cs.UnLock();
        pMYView->TTYGetInfoReceived(this);
        //......
    }
    void CMYView::TTYGetInfoReceived(CClientSocket *pClientSocket)
    {
        char lpBuf[0x1000];
        m_cs.Lock();
        //下面的代码将修改内存缓冲区g_lpBuf
        //.........
       m_cs.Unlock();
    }
      

  3.   

    方法比较多,可以用事件,CRITICAL_SECTION等
    用CreateEvent()创建一个AutoReset的事件
    ThreadReceiveProc()
    {
        WaitForSingleObject();
        Receive();
        SetEvent();
    }ThreadSave()
    {
        WaitForSingleObject();
        SaveToFile();
        SetEvent();
    }
      

  4.   

    用临界区就可以了。
    void InitializeCriticalSection( 
    LPCRITICAL_SECTION lpCriticalSection ); 
    void EnterCriticalSection( 
    LPCRITICAL_SECTION lpCriticalSection ); 
    void LeaveCriticalSection( 
    LPCRITICAL_SECTION lpCriticalSection ); 
    void DeleteCriticalSection( 
    LPCRITICAL_SECTION lpCriticalSection ); MainThread
    {
    InitializeCriticalSection;
    CreateThread;
    .
    .
    .
    EnterCriticalSection;
    .
    .
    .
    LeaveCriticalSection;
    .
    .
    .
    DeleteCriticalSection
    }
    ThreadProc
    {
    .
    EnterCriticalSection;
    .
    .
    .
    LeaveCriticalSection;
    .
    }
      

  5.   

    为何不使用我们标准而美丽的C++,却要去使用什么内存池呢?定位的new——大家可能很少用到,看下面的例程#include <iostream>
    using namespace std;class C
    {
    public:
        int nVar;
    };char *pBuf = new char[1024];void main()
    {
        C *po = new(pBuf)C; // 在pBuf内存中为po申请内存
        po->nVar=6;
        cout<<po->nVar;
        // delete po;  // 这句并不需要
        delete []pBuf; // 在这句里统一释放内存
    }这就是你们想要的Memory pool ??