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
为true时让线程运行时,必须小心。编译器可能会优化循环,使其只检查循环入口的th5。thfive在循环中不会改变,因此编译器可能认为没有必要在每次循环继续时都检查thfive。
从C++11开始,您应该使用std::atomic<bool>
作为第五个的类型,另请参阅这个SO问题。
您还可以考虑创建一个事件,并在工作线程终止时向该事件发出信号。但如何做到这一点取决于您使用的平台。例如,对于Windows,套接字API也可以基于事件使用,因此线程可以使用一个函数调用来并行等待终止事件或套接字事件(无需轮询)。
相关文章:
- 为什么即使调用了析构函数,C++11 中的分离线程也可以执行
- 检查分离的线程是否还活着?
- 为什么分离线程没有得到输出消息
- 如何"stop"正在等待条件变量的分离线程?
- 线程::加入与分离
- C++ 11 线程在分离后会自动销毁吗?
- 分离的线程:在繁忙时销毁互斥锁 错误C++
- 分离线程然后让它超出范围(并使其仍在运行)是否安全?
- 自终止线程.使用联接或分离
- 为什么 std::call_once 在联接和分离的线程中的行为不同?
- 重用分离的线程
- 为什么线程分离时程序挂起
- 防止线程在处理异常后在分离时调用 std::terminate()
- 无法永远分离线程 c++
- 如何知道分离的STD ::线程是否完成了执行
- 访问全局或静态对象的分离线程
- 向量未在分离的线程中推送值
- 在GTKMM中,在分离的线程中发生失效后,on_draw方法将停止调用
- 分离的情况 std::线程在 parrent 线程离开其块之后
- C++11线程分离