线程访问内存的问题。
如下程序,我在main里调用WinSocket的AcceptSocket方法没问题。。
但把步移到线程里,调试发现不能访问WinSocket的成员变量,nClientSocketAddrLen。。
这是什么问题啊,,线程里是用的这个对象的引用阿。。为什么无法访问呢~~
听听高手的解答。
程序如下
TestMian:
WinSocket.h WinSocket.cpp
但把步移到线程里,调试发现不能访问WinSocket的成员变量,nClientSocketAddrLen。。
这是什么问题啊,,线程里是用的这个对象的引用阿。。为什么无法访问呢~~
听听高手的解答。
程序如下
TestMian:
//#include <windows.h>
#include <iostream>
#include <winsock2.h>
#include "WinSocket.h"
#pragma comment(lib,"Ws2_32.lib")
using namespace std;
const u_long PORT = 5555;
HANDLE hHand;
DWORD WINAPI doAcceptConnect(WinSocket &winSocket);
int main()
{
WinSocket winSocket;
if(winSocket.InitSocketLib())
{
return 0;
}
SOCKADDR_IN serverSockAddr;
serverSockAddr.sin_addr.S_un.S_addr = htons(INADDR_ANY);
serverSockAddr.sin_family = AF_INET;
serverSockAddr.sin_port = htons(PORT);
if(!winSocket.CreateSocket())
{
return 0;
}
if(!winSocket.BindSocket(serverSockAddr))
{
return 0;
}
if(!winSocket.ListenSocket(2))
{
return 0;
}
/* if(!winSocket.AcceptSocket())
{
return 0;
}*/
hHand = CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)doAcceptConnect,NULL,0,NULL);
while(1)
{
Sleep(500);
}
}
DWORD WINAPI doAcceptConnect(WinSocket &winSocket)
{
while(true)
{
if(!winSocket.AcceptSocket())
{
return 0;
}
char *buffer = new char[255];
if(!winSocket.ReceiveSocket(&buffer))
{
return 1;
}
cout<<buffer<<endl;
}
return 0;
}
WinSocket.h WinSocket.cpp
/**
*create a sokcet server or client
**/
#ifndef WINSOCKET_H
#define WINSOCKET_H
#pragma once
//#include <windows.h>
#include <winsock2.h>
#include <iostream>
using namespace std;
#pragma comment(lib,"Ws2_32.lib")
const int SUCCESS = 1;
const int MAXBUFLEN = 256;
const int NO_FLAGS_SET = 0;
class WinSocket
{
public:
WinSocket(void);
~WinSocket(void);
/**
*listen socket
**/
int SendMessage(SOCKET ¶Socket,SOCKADDR_IN ¶SeverAddr);
/**
*init the socket lib
**/
int InitSocketLib();
/**
*craate a socket
**/
int CreateSocket();
/**
*bind the socket
**/
int BindSocket(SOCKADDR_IN ¶SeverAddr);
/**
*listen socket
**/
int ListenSocket(int nType);
/**
*listen socket
**/
int AcceptSocket();
/**
*listen socket
**/
int ConnectSocket(string strServerIP,int nPort);
/**
*listen socket
**/
int ReceiveSocket(char **buffer);
private:
WSADATA m_WSAdata;
SOCKET m_socket,m_ClientSocket;
SOCKADDR_IN m_ServerSockAddr,m_ClientSocketAddr;
int nClientSocketAddrLen;
};
#endif
#include "WinSocket.h"
WinSocket::WinSocket(void)
{
}
WinSocket::~WinSocket(void)
{
}
/**
*init the socket lib
**/
int WinSocket::InitSocketLib()
{
return WSAStartup(MAKEWORD(1, 1), &m_WSAdata);
}
/**
*craate a Socket
**/
int WinSocket::CreateSocket()
{
m_socket = socket(AF_INET, SOCK_STREAM, 0);
if(m_socket==INVALID_SOCKET)
{
return ERROR;
}
return SUCCESS;
}
/**
*bind the socket
**/
int WinSocket::BindSocket(SOCKADDR_IN ¶SeverAddr)
{
if(bind(m_socket,(LPSOCKADDR)¶SeverAddr,sizeof(paraSeverAddr)) == SOCKET_ERROR)
{
return ERROR;
}
return SUCCESS;
}
/**
*listen socket
**/
int WinSocket::ListenSocket(int nType)
{
if(listen(m_socket,nType)==SOCKET_ERROR)
{
return ERROR;
}
return SUCCESS;
}
/**
*listen socket
**/
int WinSocket::AcceptSocket()
{
nClientSocketAddrLen = sizeof(m_ClientSocketAddr);
int nResult = accept(m_socket,(LPSOCKADDR)&m_ClientSocketAddr,&nClientSocketAddrLen);
if(nResult==SOCKET_ERROR)
{
return ERROR;
}
return SUCCESS;
}
/**
*listen socket
**/
int WinSocket::ConnectSocket(string strServerIP,int nPort)
{
m_ServerSockAddr.sin_addr.S_un.S_addr = inet_addr(strServerIP.c_str());
m_ServerSockAddr.sin_port = nPort;
m_ServerSockAddr.sin_family = AF_INET;
if(connect(m_socket,(LPSOCKADDR)&m_ServerSockAddr,sizeof(m_ServerSockAddr))==SOCKET_ERROR)
{
return ERROR;
}
return SUCCESS;
}
/**
*listen socket
**/
int WinSocket::ReceiveSocket(char **buffer)
{
int nResult = recv(m_ClientSocket,*buffer,MAXBUFLEN, NO_FLAGS_SET);
if(nResult == 0 || nResult == SOCKET_ERROR)
{
return ERROR;
}
return SUCCESS;
}
...全文
相关推荐
定位多线程内存越界问题实践总结
首先,问题出现在一个名为OceanBase MergeServer的多线程服务器程序中,当并发线程读取数据时,程序偶尔会因非法内存访问而core掉。
内存模型-多线程内存模型
#### 三、C++09内存模型的动机C++09内存模型的引入主要是为了解决以下两个关键问题:1. **多线程编程的可移植性**:早期的C++标准并没有明确规定如何处理多线程编程中的内存一致性问题。
C#内存释放-线程控制-线程启动-线程暂停
理解这些概念对于编写高效、稳定的多线程应用程序至关重要。在实践中,应始终注意线程同步和内存管理的最佳实践,以避免可能出现的问题,如死锁、竞态条件和内存泄漏。
Java线程并发访问代码分析
结论本文通过示例代码介绍了Java线程并发访问代码分析的知识点,包括volatile关键字的使用、Java内存模型和线程安全问题等。希望对大家的学习有所帮助。
走下神坛的内存调试器--定位多线程内存越界问题实践总结.pdf
多线程内存越界问题的诊断实践诊断多线程程序中的内存越界问题通常需要仔细地分析和重建问题发生时的场景。


