在我們的產品,我們擁有可以基本上這個功能簡化代碼:從處理程序或處理程序中刪除boost :: asio定時器是否安全?
#include <boost/asio/steady_timer.hpp>
#include <functional>
void DelayedCall(
boost::asio::io_service& io,
boost::asio::steady_timer::duration delay,
std::function<void()> f)
{
auto timer = std::make_shared<boost::asio::steady_timer>(io, delay);
timer->async_wait(
[timer, f](boost::system::error_code const&)
{
// Probably it's ok to do even this:
//timer.reset();
f();
}
);
}
假設io
對象具有簡單的全球壽命。
正如你可以看到計時器對象將在處理器的析構函數被破壞。
當這個問題出現在我的腦海裏時,我提防了定時器中的一些引用執行了處理程序,反之亦然。我知道定時器析構函數將調用所有異步等待處理程序上的cancel,但這與處理程序已經執行並且無法取消無關。
現在我覺得計時器對象只是post()
小號處理程序io_service
當時間一到,所以定時器和處理相互獨立。儘管如此,快速嘗試調查asio源代碼失敗,所以我仍然不確定我們的代碼是否正確。
我相信你,但你的引文與我的問題無關。他們都談論一個'io_service'對象,而不是定時器。我沒有在定時器文檔中找到任何[這裏](http://www.boost.org/doc/libs/1_60_0/doc/html/boost_asio/reference/steady_timer.html),也沒有[http: //www.boost.org/doc/libs/1_60_0/doc/html/boost_asio/reference/WaitableTimerService.html)。 – magras
@magras也許我誤解了這個問題。前者的引用是爲了強調Asio已經被開發來支持你的代碼使用的資源管理類型。鏈接的材料一起定義了處理程序何時被銷燬,並且在您的情況下,這會定義何時會銷燬「steady_timer」。 –
我的不好。我試圖澄清問題。如果你仍然對它感興趣,請檢查編輯。 – magras