它如何清除已在io_service::strand
排隊的所有已發佈任務?我看不到來自boost文檔的類似方法。它是如何清除所有已經在隊列中排隊的任務的?
回答
我還沒有找到它的需要,因爲它可以通過正確設計異步調用鏈來正確解決。一般而言,Boost.Asio API的設計經過精心設計,可防止複雜應用程序在異步流程中變得複雜。
如果您已經檢查了呼叫鏈,並且絕對肯定重新設計它們的努力比引入清理鏈的複雜性更具當前和未來風險,那麼有一種方法可以實現它。但是,它的主要副作用是刪除strand
及其關聯的io_service
內的所有非引用處理程序。
當銷售strand
時,其destructor調度未調用的處理程序以在io_service
上延期調用,以保證非併發性。 io_service
destructor指出被調度爲延期調用的未被調用的處理程序對象被銷燬。因此,通過控制strand
和io_service
的生存期,可以清除鏈中的處理程序。
這是一個過分簡化的示例,其幫助類clearable_strand
。
#include <boost/asio.hpp>
#include <boost/bind.hpp>
#include <boost/optional.hpp>
#include <boost/utility/in_place_factory.hpp>
class clearable_strand
{
public:
clearable_strand(boost::asio::io_service& main_io_service)
: main_io_service_(main_io_service)
{
clear();
}
public:
template <typename Handler>
void post(const Handler& handler)
{
// Post handler into the local strand.
local_strand_->post(handler);
// Local service now has work, so post its run handler to the
// main service.
main_io_service_.post(boost::bind(
&boost::asio::io_service::run_one, boost::ref(local_io_service_)));
}
void clear()
{
// Destroy previous (if any).
local_strand_ = boost::none;
local_io_service_ = boost::none;
// Reconstruct.
local_io_service_ = boost::in_place();
local_strand_ = boost::in_place(boost::ref(local_io_service_.get()));
}
private:
boost::asio::io_service& main_io_service_;
boost::optional<boost::asio::io_service> local_io_service_;
boost::optional<boost::asio::strand> local_strand_;
};
要使得僅strand
的處理程序被破壞,所述類使用內部io_service
而不是附接strand
到主io_service
最小化的效果。當工作發佈到strand
時,處理程序將發佈到主要的io_service
,該處理器將菊花鏈連接併爲當地服務io_service
。
及其用法:
void print(unsigned int x)
{
std::cout << x << std::endl;
}
int main()
{
boost::asio::io_service io_service;
io_service.post(boost::bind(&print, 1));
clearable_strand strand(io_service);
strand.post(boost::bind(&print, 2));
strand.post(boost::bind(&print, 3));
strand.clear(); // Handler 2 and 3 deleted.
strand.post(boost::bind(&print, 4));
io_service.run();
}
運行程序將輸出1
和4
。我想強調一下,這是一個過於簡單的例子,並且以非複雜的方式提供線程安全以匹配boost::asio::strand
可能是一個挑戰。
謝謝你的解決方案。 – 2013-03-06 15:58:29
這是不可能的,你需要根據你的目標重新設計你的設計。如果您希望某些高優先級處理程序在低優先級處理程序之前運行,則可以使用prioritized handler example。
您的優先級處理程序示例非常有趣,它可以對我未來的項目非常有用。我會爲此加書籤。謝謝。 – 2013-03-06 15:57:21
- 1. 刪除ThreadPoolExecutor的所有排隊任務
- 2. 如何清除(刪除)jquery中所有排隊的函數?
- 3. 如何用python中的芹菜清除特定隊列的所有任務?
- 4. 如何使用F#清除服務器上的所有隊列?
- 5. 如何判斷任務是否已在django-celery中排隊?
- 6. 如何清除NiFi隊列?
- 7. 如何識別GAE拉隊列中是否已存在任務?
- 8. 如何清除Jboss中的JMS隊列
- 9. 清理隊列中所有其他請求的GCD隊列
- 10. 如何使用celery和django來運行已經在rabbitmq隊列中的任務?
- 11. 我該如何檢查我是否已經排隊完成任務?
- 12. 排隊任務jQuery
- 13. 扭曲CPU隊列任務的隊列
- 14. 在任務隊列
- 15. Python - 檢查隊列中的所有任務是否完成
- 16. 排隊的任務。運行
- 17. 如何清除MPMusicPlayerController的隊列?
- 18. 如何從GCD調度隊列中刪除排隊的塊?
- 19. 的Rails:如何檢查是否電子郵件已經排隊
- 20. 如何清除/清除VxWorks中的消息隊列緩衝區?
- 21. 如果已經入隊,請停止Hangfire作業排隊
- 22. ScheduledThreadPoolExecutor任務從隊列中刪除
- 23. 優先隊列是否真的排隊?
- 24. 如何刪除ThreadPoolExecutor中的舊排隊任務並插入新任務?
- 25. 清除SQL Server服務代理隊列
- 26. 如何一次清空Nifi中的所有隊列?
- 27. 任務隊列 - PHP
- 28. 任務隊列java
- 29. C#隊列任務
- 30. 是否有可能在同一事務中出隊和排隊
這是不可能的。考慮重新設計需要這種功能的模塊。 – 2013-03-04 18:02:23
完全同意。只是出於好奇。 – 2013-03-06 15:52:33