我在做socket的服务程序,我的思路是定义一个参数结构指针param,存放socket以及client的地址等信息。accept到一个连接后,m_param=new param,然后将socket以及client的地址等信息赋值给m_param,创建子线程,将m_param作参数传递。在子线程结束时,delete m_param。
现在的问题是:
多线程并发时,子线程执行到delete m_param;出错。
多线程串行或封掉delete m_param语句都不会出错。
问题在哪里呢?
现在的问题是:
多线程并发时,子线程执行到delete m_param;出错。
多线程串行或封掉delete m_param语句都不会出错。
问题在哪里呢?
{
SOCKET sckClient;
sockaddr_in addr;
}WORKPARAM;Listen 线程:
{
int iRet, addrLen;
sockaddr_in addr, addrAccept;
SOCKET sckListen, sckAccept;
char pszMsg[512]; sckListen = socket(AF_INET, SOCK_STREAM, 0);
iRet = gethostname(pszMsg, 256);
hostent* pEnt = gethostbyname(pszMsg);
memcpy(&(addr.sin_addr), pEnt->h_addr, pEnt->h_length);
addr.sin_family = AF_INET;
addr.sin_port = htons(9000);
iRet = bind(sckListen, (const sockaddr*)&addr, sizeof(addr));
iRet = listen(sckListen, SOMAXCONN); while(1)
{
addrLen = sizeof(addrAccept);
sckAccept = accept(sckListen, (struct sockaddr*)&addrAccept, &addrLen);
if(sckAccept==INVALID_SOCKET)
{
return 0;
} pServer->pWorkParam = new WORKPARAM;
pServer->pWorkParam->sckClient = sckAccept;
pServer->pWorkParam->addr = addrAccept; AfxBeginThread(WorkingThread, (LPVOID)pServer, THREAD_PRIORITY_BELOW_NORMAL);
} return 0;
}工作线程:UINT CServer::WorkingThread(LPVOID lpVoid)
{
int iRet;
CServer* pServer = (CServer*)lpVoid;
WORKPARAM* pThreadParam = pServer->pWorkParam; //接收
//处理
//发送 closesocket(pThreadParam->sckClient); delete pThreadParam;
return 0;
}
你可以把你的相关代码再看看,或者贴出来大家一起讨论。
{
int iRet, addrLen;
sockaddr_in addr, addrAccept;
SOCKET sckListen, sckAccept;
char pszMsg[512]; sckListen = socket(AF_INET, SOCK_STREAM, 0);
iRet = gethostname(pszMsg, 256);
hostent* pEnt = gethostbyname(pszMsg);
memcpy(&(addr.sin_addr), pEnt->h_addr, pEnt->h_length);
addr.sin_family = AF_INET;
addr.sin_port = htons(9000);
iRet = bind(sckListen, (const sockaddr*)&addr, sizeof(addr));
iRet = listen(sckListen, SOMAXCONN); while(1)
{
addrLen = sizeof(addrAccept);
sckAccept = accept(sckListen, (struct sockaddr*)&addrAccept, &addrLen);
if(sckAccept==INVALID_SOCKET)
{
return 0;
} WORKPARAM* pWorkParam = new WORKPARAM;
pWorkParam->sckClient = sckAccept;
pWorkParam->addr = addrAccept; AfxBeginThread(WorkingThread, (LPVOID)pWorkParam, THREAD_PRIORITY_BELOW_NORMAL);
} return 0;
}工作线程:UINT CServer::WorkingThread(LPVOID lpVoid)
{
int iRet;
WORKPARAM* pThreadParam = (WORKPARAM*)lpVoid; //接收
//处理
//发送 closesocket(pThreadParam->sckClient); delete pThreadParam;
return 0;
}
{
// Construction
public:
CSwDlg(CWnd* pParent = NULL); // standard constructor
CSServer m_Server;
.....
}
BOOL CSwDlg::OnInitDialog()
{
AfxBeginThread(CServer::ListenThread, &m_Server,THREAD_PRIORITY_BELOW_NORMAL);
......
}
class CServer
{
public:
CServer();
virtual ~CServer(); WORKPARAM* pWorkParam;
public:
static UINT ListenThread(LPVOID lpVoid);
static UINT WorkingThread(LPVOID lpVoid);};
UINT CServer::ListenThread(LPVOID lpVoid)
{
int iRet, addrLen;
sockaddr_in addr, addrAccept;
SOCKET sckListen, sckAccept;
char pszMsg[512]; CServer* pServer = (CServer*)lpVoid; //这句刚才贴漏了
......
}