C++ 在windows创建几个线程,并在该线程中创建加载库或者创建socket或者listen等就会出错?如果在进行中创建这就正确,为什么啊? 具体代码如下!
DWORD WINAPI ClientThread(LPVOID lpParam)//为客户服务的线程函数
{
CSocketThread *pSocketThread = (CSocketThread*)lpParam;
pSocketThread->InitNetwork();
return 0;
}
CSocketThread::CSocketThread()
{
·····
HANDLE hThread;//对客户服务线程的句柄
hThread = CreateThread(NULL,0,ClientThread,this,0,NULL);
if (hThread == NULL)//如果线程创建失败
{
printf("创建线程失败:%d\n",WSAGetLastError());
}
CloseHandle(hThread);//创建并运行线程后,马上关闭线程句柄
}
BOOL CSocketThread::InitNetwork()//初始化网络函数
{
BOOL ret = WSAStartup(MAKEWORD(2,2), &wsaData);
if(ret != 0)
{
printf("初始化网络协议失败!");
return FALSE;
}
if ( 2 == LOBYTE(wsaData.wVersion) && 2 == HIBYTE(wsaData.wVersion) )
{
printf("加载winSock版本正确");
}*/
//创建服务器端套接字
sListenSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);//SOCK_DGRAM\SOCK_STREAM
if(sListenSocket == INVALID_SOCKET)
{
printf("创建套接字失败:%d\n",WSAGetLastError());
system("Pause");
closesocket(sListenSocket);
//WSACleanup();
return FALSE;
}
······
} socket??多线程?windows
[解决办法]
CreateThread 不要用于MFC
MFC 用AfxBeginThread 比较好.
C++ _beginthreadex 比较好.
C,使用库函数,也是_beginthreadex 比较好.
只有,单纯使用Api,Sdk 开发的程序,才考虑用CreateThread.
CreateThread 遭遇C++析构构造函数和异常,会出现麻烦.
C,C++,库中有些全局变量和静态变量也会有问题.
API,SDK, CreateThread 多线程,只会出现,任何情况下,多线程特有的问题,主要是同步问题,这个可以解决.
另外 DEV c++ 和CreateThread 配合,天生就会出问题,你要自己调度线程,就会出现死锁.
估计是,缺省设为多线程的.输入输出会加锁.
[解决办法]
9楼正解。 无论MFC、还是CRT、C++RT都需要对线程进行特殊的初始化后才能在该线程中使用,因此都有各自封装的线程API。
C++ 在windows创设几个线程,并在该线程中创建加载库或者创建socket或者listen等就会出错?如果在进行中创建这就正确,为什么啊 具体代码如下
C++ 在windows创建几个线程,并在该线程中创建加载库或者创建socket或者listen等就会出错?如果在进行中创建
