这种线程怎么结束 m_bStop = true 貌似不管用

从此不归路 2017-12-01 05:31:26
DWORD _stdcall acceptThreadFun(LPVOID lpValue)
{
SOCKADDR_IN addrClient;
int len = sizeof(SOCKADDR);

while(!m_bStop)
{
//等待客户请求到来
SOCKET sockConn = accept(m_sockSrv, (SOCKADDR *) &addrClient, &len);
if(sockConn == SOCKET_ERROR)
{
continue;
}
char recvBuf[10240] = {0};
//接收数据
int len = recv(sockConn, recvBuf, sizeof(recvBuf), 0);
if (len == 0)
{
}
else if (len == SOCKET_ERROR)
{
}
else
{
}
closesocket(sockConn);
}
return 0;
}
...全文
457 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
EL-PAAS微服务 2018-07-26
  • 打赏
  • 举报
回复
应该是阻塞在while循环里面。
wyfwx 2018-07-12
  • 打赏
  • 举报
回复
加上超时吧,当超时后,退出阻塞,你就退出 了
_肆 2018-07-12
  • 打赏
  • 举报
回复
当你更改了while中的判定量时,一般while正执行里面的内容到一般的时候,所以新的判定量只决定了下一while的判定会退出,但是socket的函数会让程序阻塞,收不到东西就一直阻塞,退不出当前的while,也就判定不了下一个while

你可以在代码中添加数个messagebox来看你当前线程执行到哪一步,阻塞在哪一步
ShanTUT 2018-07-10
  • 打赏
  • 举报
回复
结束线程?调用TerminateThread,然后用CloseHandle关掉句柄。
泡浴露 2018-07-10
  • 打赏
  • 举报
回复
引用 7 楼 tajon1226 的回复:
[quote=引用 6 楼 hou09tian 的回复:]
套接字是阻塞的,如果没有客户端connect,服务端的accept()函数会一直阻塞,即使把m_bStop设置成TRUE也没有,此时acceptThreadFun线程还是会挂起,不会结束。
可以考虑手动结束这个线程


引用 6 楼 hou09tian 的回复:
套接字是阻塞的,如果没有客户端connect,服务端的accept()函数会一直阻塞,即使把m_bStop设置成TRUE也没有,此时acceptThreadFun线程还是会挂起,不会结束。
可以考虑手动结束这个线程


手动结束线程是不可取的[/quote]

建议使用非阻塞,然后使用IO多路复用机制
月凉西厢 2018-07-09
  • 打赏
  • 举报
回复
最简单的方法是给socket设置一个超时时间。,在while内,accept之前,可以使用select(……,thimeout)
走好每一步 2018-07-06
  • 打赏
  • 举报
回复
//等待客户请求到来
SOCKET sockConn = accept(m_sockSrv, (SOCKADDR *) &addrClient, &len);

accept函数是阻塞,你只把m_bStop置位肯定不管用,你要同时m_sockSrv关闭,让accept返回!!
JackyRao 2018-07-06
  • 打赏
  • 举报
回复
应该管用的, 在别的地方把m_bStop 设为TRUE ,循环就结束, acceptThreadFun 就退出了
走好每一步 2018-07-06
  • 打赏
  • 举报
回复
引用 6 楼 hou09tian 的回复:
套接字是阻塞的,如果没有客户端connect,服务端的accept()函数会一直阻塞,即使把m_bStop设置成TRUE也没有,此时acceptThreadFun线程还是会挂起,不会结束。
可以考虑手动结束这个线程


引用 6 楼 hou09tian 的回复:
套接字是阻塞的,如果没有客户端connect,服务端的accept()函数会一直阻塞,即使把m_bStop设置成TRUE也没有,此时acceptThreadFun线程还是会挂起,不会结束。
可以考虑手动结束这个线程


手动结束线程是不可取的
棉猴 2018-07-06
  • 打赏
  • 举报
回复
套接字是阻塞的,如果没有客户端connect,服务端的accept()函数会一直阻塞,即使把m_bStop设置成TRUE也没有,此时acceptThreadFun线程还是会挂起,不会结束。
可以考虑手动结束这个线程
www_adintr_com 2017-12-01
  • 打赏
  • 举报
回复
1. m_bStop 是否是定义成 volatile 的? 2. socket 是否都设置成了非阻塞模式? 如果没有的话外面要结束线程的时候把 socket close 了.
真相重于对错 2017-12-01
  • 打赏
  • 举报
回复
如果那个变量是个全局的呢,可以被别线程访问呢?

64,636

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧