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

C++ Ending detached thread from main thread

本文关键字:线程 分离 结束 C++      更新时间:2023-10-16

我在结束分离线程时遇到问题:

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为true时让线程运行时,必须小心。编译器可能会优化循环,使其只检查循环入口的th5。thfive在循环中不会改变,因此编译器可能认为没有必要在每次循环继续时都检查thfive。

从C++11开始,您应该使用std::atomic<bool>作为第五个的类型,另请参阅这个SO问题。

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