繁体   English   中英

C++ 结束与主线程分离的线程

[英]C++ Ending detached thread from main thread

我有结束分离线程的问题:

void fun_5(int sock_connect)    
{
    unsigned char buff2[76] = {0x01 ,0x01 ,0x02 ,0x02 ,0x00 ,0x4a ,0x31 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x04 ,0x00 ,0x00 ,0x50 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x50 ,0x4c ,0x4d ,0x4f ,0x4d ,0x49 ,0x46 ,0x41 ,0x58 ,0x20 ,0x20 ,0x4e ,0x52 ,0x20 ,0x41 ,0x00 ,0x34 ,0x41 ,0x50 ,0x3c ,0x32 ,0x31 ,0x3e ,0x35 ,0x46 ,0x2e ,0x52 ,0x32 ,0x31 ,0x30 ,0x2f ,0x31 ,0x35 ,0x2f ,0x31 ,0x32 ,0x31 ,0x35 ,0x3a ,0x31 ,0x31 ,0x3a ,0x30 ,0x36 ,0x00 ,0xff ,0xef};
while(thfive)
    {   
            if((send( sock_connect, buff2, sizeof(buff2), MSG_NOSIGNAL ) ) <= 0 )
            {
                close(sock_connect);
                break;
            }
            sleep(5);
    }

}       

当连接到服务器的客户端(我的程序)发送指定的字节序列(“开始”)时,该线程每 5 秒发送一次字节,当客户端发送其他序列(“停止”)时,它应该停止发送。

while(thfive) <<- thfive is true when client sends "start", and its false when client sends "stop"

但是当客户端在不到 5 秒的时间内在“停止”之后发送“开始”时,线程一直在运行。 因此,这个解决方案并不是最好的。 即使线程休眠,也可以选择检查条件吗? 或者我如何从主线程中杀死这个分离的线程?

它在分离线程中工作,因为同时,程序执行其他功能。 我同时有更多这样的线程(每 1.5 秒、10 秒等发送一次字节)。 我还是编程新手,第一次使用多任务。

谢谢。

编辑 1:我的操作系统是 Linux。

当你让线程运行而thfive为真时,你必须小心。 编译器可能会优化循环,以便它只在循环入口处检查 thfive。 thfive 在循环内不会改变,因此编译器可能认为没有必要在每次循环继续时检查 thfive。

从 C++11 开始,您应该使用std::atomic<bool>作为 thfive 的类型,另请参阅此 SO question

您还可以考虑创建一个事件并在工作线程终止时向该事件发出信号。 但是如何做到这一点取决于您使用的平台。 例如,对于 Windows,套接字 API 也可以基于事件使用,因此线程可以使用一个函数调用来并行等待终止事件或套接字事件(无需轮询)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM