Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/150.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C++;结束从主线程分离的线程_C++_Multithreading - Fatal编程技术网

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

C++ C++;结束从主线程分离的线程,c++,multithreading,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 ,

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

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

}       
void fun_5(int sock_connect)
{
无符号字符buff2[76]={0x01、0x01、0x02、0x02、0x00、0x4a、0x31、0x00、0x00、0x00、0x00、0x00、0x00、0x00、0x00、0x00、0x00、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、0x34、0x50、0x32、0x35、0x35、0x35、0x35、0x35、0x35、0x32、0x32,0x30、0x2f、0x31、0x35、0x2f、0x31、0x32、0x31、0x35、0x3a、0x31、0x31、0x3a、0x30、0x36、0x00、0xff、0xef};
而(第五节)
{   

if((发送(sock_connect、buff2、sizeof(buff2)、MSG_NOSIGNAL))当您让线程在
thfive
为true时运行时,您必须小心。编译器可能会优化循环,使其仅在循环入口检查thfive。thfive在循环内部不会更改,因此编译器可能认为不必每次循环继续时都检查thfive

从C++11开始,您应该使用
std::atomic
作为thfive的类型,另请参见


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

不要在整个超时期间使用
sleep
,而是使用一些其他功能(例如
select
with
NULL
描述符集)它可以在较短的时间内睡眠,并在循环中调用以检查
thfive
的状态。但是,即使使用我前面评论中的解决方案,您仍然有可能客户端发送“start”当线程处于睡眠状态时,无论睡眠间隔有多短。您真正能做的就是将风险降至最低,或者在旧线程仍在运行的情况下不启动新线程。thfive是如何声明的?thfive声明为布尔值,它会根据传入的字节序列而变化。您是否检查设置
th的字节序列曾经收到过五个
to false吗?
volatile
不适用于此。同样:
volatile
不适用于创建同步ish变量。在任何情况下,这里都需要原子,因为否则这是一个数据竞争,结果是未定义的行为。[c++]建议OP使用C++,而当前C++标准是事实上的C++ 14,所以原子是可用的。@ GriWes我把我的建议改成原子,但也添加了易失性的SiguAsMixIt。但是我不同意C++ 14。@ WeNeNeZEZ即使在C++前11的土地上,使用<代码>易挥发的布尔-< /代码>一旦在体系结构W上运行,就很容易崩溃。默认内存顺序比x86弱。@WernerHenze,这个问题被标记为“c++”。常识上说“c++”是指最新发布的标准。如果OP想要c++11之前的解决方案,他会用。
while(thfive) <<- thfive is true when client sends "start", and its false when client sends "stop"