gpt4 book ai didi

c++ - 如何在不终止程序的情况下停止 std::thread 的运行

转载 作者:太空狗 更新时间:2023-10-29 21:00:04 25 4
gpt4 key购买 nike

我正在尝试从 C++11 学习 std::threads 来制作线程系统。

我想知道是否有一种方法可以在不终止整个程序的情况下停止线程运行(不是休眠,而是真正破坏线程等等)。

我知道 std::join 存在,但这会强制线程等待所有线程返回。

还有其他方法可以解决这个问题吗? (例如,创建一个 ThreadPool 类而不必阻塞线程?)

最佳答案

也许这个 thread_pool 可以帮助你:

#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 的运行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23117354/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com