如何在不终止程序的情况下停止std::线程的运行
How to stop an std::thread from running, without terminating the program
我正在尝试从C++11
学习std::threads
,以创建线程系统。
我想知道是否有一种方法可以在不终止整个程序的情况下阻止线程运行(不是休眠,而是真正破坏线程)。
我知道std::join
存在,但这迫使线程等待所有线程返回。
有其他方法可以解决这个问题吗?(例如,在不阻塞线程的情况下创建ThreadPool
类?)
也许这个线程工具会帮助你:
#include <boost/thread.hpp>
#include <boost/phoenix.hpp>
#include <boost/optional.hpp>
using namespace boost;
using namespace boost::phoenix::arg_names;
boost::atomic_size_t counter(0ul);
class thread_pool
{
private:
mutex mx;
condition_variable cv;
typedef function<void()> job_t;
std::deque<job_t> _queue;
thread_group pool;
boost::atomic_bool shutdown;
static void worker_thread(thread_pool& q)
{
while (optional<job_t> job = q.dequeue())
(*job)();
}
public:
thread_pool() : shutdown(false) {
for (unsigned i = 0; i < boost::thread::hardware_concurrency(); ++i)
pool.create_thread(bind(worker_thread, ref(*this)));
}
void enqueue(job_t job)
{
lock_guard<mutex> lk(mx);
_queue.push_back(job);
cv.notify_one();
}
optional<job_t> dequeue()
{
unique_lock<mutex> lk(mx);
namespace phx = boost::phoenix;
cv.wait(lk, phx::ref(shutdown) || !phx::empty(phx::ref(_queue)));
if (_queue.empty())
return none;
job_t job = _queue.front();
_queue.pop_front();
return job;
}
~thread_pool()
{
shutdown = true;
{
lock_guard<mutex> lk(mx);
cv.notify_all();
}
pool.join_all();
}
};
使用示例:live On Coliru
C++std::thread
类实际上只是一个最小的接口,它位于一些更完整的实现定义的线程包之上。因此,它只定义了少量的功能——创建新的线程detach
和join
。基本上就是这样——没有标准的方法来管理、调度、停止/启动/终止线程或做其他事情。
有一个native_handle
方法,它返回一个实现定义的类型,根据实现的不同,该类型可能用于执行您想要的操作。
没有办法非协作地阻止线程使用标准C++运行。这并不意味着这是不可能的,但您可能需要回到您的系统本机句柄。
对于符合标准的方式,您可以使用同步原语(例如std::atomic<bool>
)从外部设置终止标志,并在线程内读取它。但它仍然必须是独立完成的线程。
相关文章:
- 为什么std::async使用同一个线程运行函数
- 在声明中合并两个常量"std::set"(不是在运行时)
- C++中 std::map 的运行时复杂度是多少?
- C++在使用std::multimap时出现运行时错误的几率很小
- std::tuple 可以根据其值在编译时/运行时排序吗?
- 为什么我使用 std::copy() 收到运行时错误(分段错误)?
- 如何创建一个模板化函数,可以在任何具有字符串键的 std::map 上运行?
- std::bad_alloc运行时异常
- std::copy 导致运行时检查失败 #2
- 使用 (cin) 用户输入将其粘贴到 std::system 中,并在另一个终端中运行带有输入的命令
- 在运行之前获取 std::thread's thread:id?
- CLang:在 std::thread 中运行函数会导致结构创建BAD_ACCESS
- 使用-static libstdc++时std::线程弱,因此在运行时会导致崩溃
- 编译了一个recent-C++.因此,如果没有暴露std符号,请在旧系统上运行
- 运行 std::线程不在构造函数中
- 在运行时,何时完全初始化 std 库才能在不破坏代码的情况下使用它?
- 多线程中的 std::basicstring 的运行时分段错误C++点燃进程
- std :: list(双重链接列表)未知运行时错误
- 编译器发射std :: move()运行时调用
- 为什么用空函数运行std::线程会花费大量内存