2017-06-12 115 views
0

我想接受線程0中的連接,然後將此套接字發佈到其他線程(1 - 31)之一以進行負載均衡,然後我希望此套接字的所有其他操作都將位於同一線程中,通過使用協程 - 至避免線程上下文切換 g。如何使協程始終在同一個線程中工作?

  • 我想用io_service + work + vector<boost::thread>上進行負載平衡不同的線程執行異步回調。

  • 但是與此同時我想通過在同一個線程內使用協程來執行所有其他的操作 - 沒有負載平衡和快速的上下文切換。

如果我使用boost.coroutine1通過使用boost::asio::spawn()然後可以在協程可以在不同線程上交替地進行?

如果可以,那麼我怎樣才能讓回調的協程始終在異步操作調用的同一個線程中執行,即使io_service綁定了很多線程(線程池)?

for (size_t i = 0; i < thread_num_executors; ++i) 
     thr_grp_executors.emplace_back(
      boost::bind(&boost::asio::io_service::run, &io_service)); 

衆所周知,協同程序之間的切換非常快,大約需要10-12 NS在x86_64:http://www.boost.org/doc/libs/1_64_0/libs/coroutine/doc/html/coroutine/performance.html

但如果協同程序的切換單個線程內發生,這是唯一的真實。因爲線程切換需要超過100 ns

那麼我該如何讓協程總是在同一個線程中工作?

+0

上次我試圖讓這個工作成功,同時程序在多線程下失敗了。我會看看新的纖維庫:http://www.boost.org/doc/libs/1_64_0/libs/fiber/doc/html/fiber/overview.html – Nim

回答

1

如果io_service綁定到許多線程,則無法使工作出現在同一個「物理線程」(即邏輯核心)上。

除此之外,您可以通過在鏈上產生coro來控制「邏輯線程」。

如果您必須具有線程關聯性,我認爲沒有比在單個線程上運行io_service更好的方法,可能是重複每個線程的io_service。

所有這些都可能會隨着更廣泛的執行者提案而有所改進,我相信Chris Kohlhoff在他的github上有一個預覽回購。你不妨看看。

+0

謝謝。你是關於這個https://github.com/chriskohlhoff/executors#composition-using-resumable-functions和這個http://chriskohlhoff.github.io/executors/? – Alex

+0

這就是我記得是的 – sehe

相關問題