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

时间:2014-09-18 08:32:28

标签: c++ multithreading

我遇到了结束分离线程的问题:

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);
    }

}       

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

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

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

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

感谢。

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

1 个答案:

答案 0 :(得分:-1)

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

从C ++ 11开始,您应该使用std::atomic<bool>作为thfive的类型,另请参阅this SO question。如果您没有可用的C ++ 11,那么您可以将thfive从bool更改为volatile sig_atomic_t。

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