【发布时间】:2017-08-27 08:23:43
【问题描述】:
我正在尝试安全地取消boost::asio::basic_waitable_timer<std::chrono::steady_clock>。
根据answer,这段代码应该可以完成这项工作:
timer.get_io_service().post([&]{timer.cancel();})
恐怕它不适合我。
我是不是做错了什么?
这是我的代码:
#include <iostream>
#include "boost/asio.hpp"
#include <chrono>
#include <thread>
#include <random>
boost::asio::io_service io_service;
boost::asio::basic_waitable_timer<std::chrono::steady_clock> timer(io_service);
std::atomic<bool> started;
void handle_timeout(const boost::system::error_code& ec)
{
if (!ec) {
started = true;
std::cerr << "tid: " << std::this_thread::get_id() << ", handle_timeout\n";
timer.expires_from_now(std::chrono::milliseconds(10));
timer.async_wait(&handle_timeout);
} else if (ec == boost::asio::error::operation_aborted) {
std::cerr << "tid: " << std::this_thread::get_id() << ", handle_timeout aborted\n";
} else {
std::cerr << "tid: " << std::this_thread::get_id() << ", handle_timeout another error\n";
}
}
int main() {
std::cout << "tid: " << std::this_thread::get_id() << ", Hello, World!" << std::endl;
std::random_device rd;
std::mt19937 gen(rd());
std::uniform_int_distribution<> dis(1, 100);
for (auto i = 0; i < 1000; i++) {
started = false;
std::thread t([&](){
timer.expires_from_now(std::chrono::milliseconds(0));
timer.async_wait(&handle_timeout);
io_service.run();
});
while (!started) {};
auto sleep = dis(gen);
std::cout << "tid: " << std::this_thread::get_id() << ", i: " << i << ", sleeps for " << sleep << " [ms]" << std::endl;
std::this_thread::sleep_for(std::chrono::milliseconds(sleep));
timer.get_io_service().post([](){
std::cerr << "tid: " << std::this_thread::get_id() << ", cancelling in post\n";
timer.cancel();
});
// timer.cancel();
std::cout << "tid: " << std::this_thread::get_id() << ", i: " << i << ", waiting for thread to join()" << std::endl;
t.join();
io_service.reset();
}
return 0;
}
这是输出:
...
时间:140737335076608,handle_timeout
时间:140737335076608,handle_timeout
tid: 140737353967488, i: 2, 等待线程加入()
tid: 140737335076608, 后期取消
tid:140737335076608,handle_timeout 中止
tid: 140737353967488, i: 3, 休眠 21 [ms]
时间:140737335076608,handle_timeout
tid: 140737353967488, i: 3, 等待线程加入()
时间:140737335076608,handle_timeout
tid: 140737335076608, 后期取消
时间:140737335076608,handle_timeout
时间:140737335076608,handle_timeout
时间:140737335076608,handle_timeout
时间:140737335076608,handle_timeout
时间:140737335076608,handle_timeout
...
永远继续……
如您所见,timer.cancel() 正在从相应的线程调用:
tid: 140737335076608,在帖子中取消
但是没有
tid: 140737335076608,handle_timeout 中止
之后。
Main 永远等待。
【问题讨论】:
标签: c++ multithreading boost timer boost-asio