在多线程当中,对于同一个资源的操作应该通过临界区来操作,你这里定义的这个CMapPtrToPtr指针是一个静态指针,在进程中访问之前应该先通过一个临界区控制一下,同时只能保证有一个线程在访问该变量就可以了。如果不用临界区,程序运行将是不可见的,会出错。

解决方案 »

  1.   

    谢谢各位的回答,我已经用了CREATEEVENT()来控制了,
    问题现在不是出在这里,这个是出错时的DEBUG显示代码,我不知道是哪个变量有错啊,
    我在线程里用了 NEW CPOP3 类,里面有变量的,只要一启动线程就会出错的,但是线程的初始化都没有任何问题,不返回NULL,执行到线程的同步时就出错了,CPOP3类如下:
    #include <afxsock.h>
    #include "MailMessage.h"#define POP3_PORT 110 // Standard port for POP3 servers
    #define RESPONSE_BUFFER_SIZE 1024class CPOP3  
    {
    public:
    int outerror;
    CPOP3( LPCTSTR szPOP3ServerName, UINT nPort = POP3_PORT, LPCTSTR sUsername = NULL, LPCTSTR sPassword = NULL );
    virtual ~CPOP3();

    void SetServerProperties( LPCTSTR sServerHostName, UINT nPort = POP3_PORT );
    void SetUserProperties( LPCTSTR sUsername, LPCTSTR sPassword );
    CString GetLastError();
    UINT GetPort();
    CString GetServerHostName();
    CString GetUsername();
    CString GetPassword();
    BOOL Disconnect();
    BOOL Connect();
    int GetNumMessages();private:
    BOOL get_response( UINT executed_action ); CString m_sError;
    CString m_sResponse;
    BOOL m_bConnected;
    public:
    UINT m_nPort;
    private:
    CString m_sPOP3ServerHostName;
    CString m_sUsername;
    CString m_sPassword;
    CSocket m_wsPOP3Server;protected:
    enum eResponse
    {
    CONNECTION = 0,
    IDENTIFICATION,
    AUTHENTIFICATION,
    STATUS,
    RETRIEVE,
    DELE,
    QUIT,
    LAST_RESPONSE };
    TCHAR response_buf[ RESPONSE_BUFFER_SIZE ];};
      

  2.   

    申明为 friend DWORD WINAPI GetValueAt(void* key);
      

  3.   

    谢谢您的回答,问题那是出错时DEBUG显示的错误代码,不是我的原代码,我怎么强制转换?
    而且我将线程函数定义为已经FRIEND类型了
      

  4.   

    可能是CSocket m_wsPOP3Server;它的问题
    你可以先去掉它试验一下
      

  5.   

    线程中创建CSocket和CAsynSocket通常会有问题