Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/163.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.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++ 如何优雅地唤醒或终止睡眠中的std::线程?_C++_Multithreading_C++11_Cross Platform_Portability - Fatal编程技术网

C++ 如何优雅地唤醒或终止睡眠中的std::线程?

C++ 如何优雅地唤醒或终止睡眠中的std::线程?,c++,multithreading,c++11,cross-platform,portability,C++,Multithreading,C++11,Cross Platform,Portability,在Win32下,我可以使用TerminateThread终止线程。但我想要的是一种跨平台的方法来实现这一点 我应该如何在C++中优雅地做? < p>我建议在广播信号、信号量、条件变量或某事上睡觉,而不是做阻塞睡眠。然后,应用程序只需设置信号,任何正在睡觉的人都会醒来并可以退出。这是一个更干净的解决方案,因为它让线程体有机会清理它可能正在做的任何事情——包括释放锁 对最新情况的回应 在这种特定情况下,在调用accept之前,先调用select并超时。我建议在广播信号、信号量、条件变量或其他情况下休

在Win32下,我可以使用TerminateThread终止线程。但我想要的是一种跨平台的方法来实现这一点


<>我应该如何在C++中优雅地做?

< p>我建议在广播信号、信号量、条件变量或某事上睡觉,而不是做阻塞睡眠。然后,应用程序只需设置信号,任何正在睡觉的人都会醒来并可以退出。这是一个更干净的解决方案,因为它让线程体有机会清理它可能正在做的任何事情——包括释放锁

对最新情况的回应
在这种特定情况下,在调用accept之前,先调用select并超时。

我建议在广播信号、信号量、条件变量或其他情况下休眠,而不是执行阻塞休眠。然后,应用程序只需设置信号,任何正在睡觉的人都会醒来并可以退出。这是一个更干净的解决方案,因为它让线程体有机会清理它可能正在做的任何事情——包括释放锁

对最新情况的回应
在这种特定情况下,在调用accept之前,先调用select并超时。

第一个问题来自阻塞模式socket accept,您应该使用非阻塞模式socket

您可以在while循环中设置标志,例如:

#include <thread>
#include <chrono>

using namespace std:

void f()
{
    // Sleeping for a very long while
    while (SOCKET s = accept(listening_socket, ...))
    {
         // ...
    }

}

int main()
{
    std::thread t(f);
    DoSomething();
    t.???(); /* What to place here to wake/terminate thread f? */
}

我在示例中使用了一个终止于您可以使用条件变量首选方式的标志。

第一个问题来自阻塞模式套接字接受,您应该使用非阻塞套接字模式

您可以在while循环中设置标志,例如:

#include <thread>
#include <chrono>

using namespace std:

void f()
{
    // Sleeping for a very long while
    while (SOCKET s = accept(listening_socket, ...))
    {
         // ...
    }

}

int main()
{
    std::thread t(f);
    DoSomething();
    t.???(); /* What to place here to wake/terminate thread f? */
}


我在示例中使用了一个终止于您可以使用条件变量首选方式的标志。

设计多线程应用程序的一条规则:永远不要杀死线程,让它们自杀。为什么您希望它从第一步开始就休眠这么长时间?对一个条件变量执行定时等待,该条件变量有main引用,而不是sleep,如果条件触发,则返回。@billz,线程正在侦听新的连接。我已经更新了原始帖子。设置了一些“终止”标志,然后临时打开一个本地连接以使接受返回。设计多线程应用程序的一条规则:永远不要杀死线程,就让他们自杀吧。为什么你想让它从第一步开始休眠这么长时间?对main引用的条件变量执行定时等待,而不是休眠,如果条件触发,则返回。@billz,线程正在侦听新连接。我已经更新了原始帖子。设置了一些“终止”标志,然后临时打开一个本地连接以进行接受返回。我已经更新了原始帖子中的示例代码。线程不能在给定的事件对象上等待,因为它被阻塞在系统提供的函数中。线程无法在给定的事件对象上等待,因为该对象在系统提供的函数中被阻止。注意,正如所写的那样,该对象上的数据竞争已终止。@GManNickG请提供更多详细信息?你的意思是连接和终止?如果一个变量在其他线程读取或写入它的同时被写入,这就是数据竞争。在读取时,可以将此处is_terminated写入is_terminated=true!被终止。它需要是std::atomic或使用互斥锁进行保护,但这太过分了。请注意,如前所述,它在上有一个数据争用,因此被终止。@GManNickG请提供更多详细信息?你的意思是连接和终止?如果一个变量在其他线程读取或写入它的同时被写入,这就是数据竞争。在读取时,可以将此处is_terminated写入is_terminated=true!被终止。它需要是std::atomic或使用互斥锁进行保护,但这太过分了。