boost thread๋ฅผ ํ์ฉํ์ฌ io_context_pool์ ๋ง๋ค์ด์ ์ฌ์ฉํ๋ ์ค.. core๊ฐ ๋ฌ๋ค
์ด์ ๋๋์ง๋ ์์..
์ฐธ๊ณ ํ ThreadPool ์์๋ ์๋์ ์ฒจ๋ถ ๋งํฌ๋ก ์ฌ๋ ค๋๊ฒ ๋ค
CMD> ./process
...
/usr/include/boost/smart_ptr/shared_ptr.hpp:728: typename boost::detail::sp_derr<T>::operator*() const [with T = boost::asio::io_context; typename boost::deta_context&]: Assertion `px != 0' failed.
Aborted (core dumped)
๊ทธ๋ฌ๋ค ๋น์ทํ ์๋ฌ๋ฅผ ๊ฐ์ง stack overflow ๊ธ์ ๋ณด์๋๋ฐ ๋ด์ฉ์ ์ด๋ฌํ๋ค
์ผ๋จ ์์ธ์, boost ์์ io_context๋ฅผ ์ป์ด์ค๋ ํจ์์ธ get_executor() ์ฌ์ฉ์์
์์ ๊ฐ์ฒด๋ก ์ป์ด์ค๋ ๊ฒฝ์ฐ์ core๊ฐ ๋ฐ์ํ ์ ์๋ค๋ ๊ฒ์ด์๋ค
auto ui_desktop = std::make_shared<desktop>(ui_context.get_executor());
get_executor()๋ ์์๊ฐ ์ด๋ป๊ฒ ์๊ฒผ๋๋ฉด
/* io_context::get_executor */
executor_type get_executor();
๊ทธ๋ฅ ์๋ ๋ค
main ํจ์์์ ์์๊ฐ์ฒด excutor์ get_executor()์ ๊ฐ์ ์ ์ฅํด์ ์ฌ์ฉํ๋ค๋ฉด
main ํจ์๊ฐ ๋๋๋ฉด? ์ด ๊ฐ์ ์ ํจํ์ง ์๊ฒ ๋๋ ๊ฒ์ด๋ค...
๊ทธ๋ฌ๊ณ ์ด ๊ฐ์ ๋ค์ ์ ๊ทผํ๋ฉด ์๋ชป๋ ๋ฉ๋ชจ๋ฆฌ ์ ๊ทผ์ ํด์ ๋ฌธ์ ๊ฐ ๋ ์ ์๋ค
๋ผ๋ ๋ด์ฉใ
๋ง์ฝ ์ด์ฉ๋ค ์ ๋๋ค ํ๋๋ผ๋ ์๋ ๋ฉ๋ชจ๋ฆฌ๋ผ๋๊ฒ ๊ทธ ํฌ๊ธฐ๋งํผ ๊ณต๊ฐ์ด ์กํ๋ฉด
๋ค์ ๊ทธ ๋ฉ๋ชจ๋ฆฌ ์ฃผ์์ ์ ๊ทผ ์ํ๋ฉด ๋ฌธ์ ๊ฐ ์์ด ๋ณด์ผ ์๋ ์์ผ๋
๋ฐฉ์ฌํ์ง๋ง์
๋ต๋ณ์ ๋ฌ์์ค ๋ถ์ ํด๊ฒฐ ๋ฐฉ๋ฒ์ ์๋์ ๊ฐ์ด ๋ฌ์๋ค
ui_desktop ๊ฐ์ฒด๊ฐ ๋ณด์ ํ ์ฐธ์กฐ๊ฐ ์ ํจํ๋๋ก
get_executor์์ ๋ฐํ๋ ์คํ์๊ฐ ๋ฒ์๋ฅผ ๋ฒ์ด๋์ง ์๋์ง ํ์ธํด๋ผ.
์๋ฅผ ๋ค์ด, get_executor์ ๊ฒฐ๊ณผ๋ฅผ ์ฃผ ๋ณ์์ ๋ณ์์ ํ ๋น์ ํด๋ผ.
auto executor{ui_context.get_executor()};
auto ui_desktop = std::make_shared<desktop>(executor);
์ด๋ ๊ฒ ใ
์ฐธ๊ณ ) object { } ์ฌ์ฉ
C++ 11์ ์ถ๊ฐ๋ ์ด๊ธฐํ ๋ฌธ๋ฒ์ธ๋ฐ, ์ ๋ํผ ์ด๊ธฐํ๋ผ๊ณ ๋ถ๋ฅธ๋ค
int temp(0);์ ์๋์ง๋ง int temp{0}์ ๋๋ค ใ
์์ ๋ฐฉ๋ฒ์ boost io_context๋ฅผ ์ข๋ ์ ์ฐ๊ธฐ ์ํ ๋ฐฉ๋ฒ์ด๋ ์ฐธ๊ณ ๋ฐ๋ผ๊ณ ,
boost ์์์ ๋ํ ์ถ๊ฐ์ ์ธ ์ค๋ช ์ ๋ง๋ถ์ด๊ณ ๋๋ด๊ฒ ๋ค
io_context_pool::io_context_pool(std::size_t pool_size)
: next_io_context_(0)
{
if (pool_size == 0)
throw std::runtime_error("io_context_pool size is 0");
// Give all the io_contexts work to do so that their run() functions will not
// exit until they are explicitly stopped.
for (std::size_t i = 0; i < pool_size; ++i)
{
io_context_ptr io_context(new boost::asio::io_context);
io_contexts_.push_back(io_context);
work_.push_back(boost::asio::require(io_context->get_executor(),
boost::asio::execution::outstanding_work.tracked));
}
}
์๋ ์ฒจ๋ถ์ ๋งํฌ๋ฅผ ๋ io_context_pool class์ ์์ฑ์์ธ๋ฐ,
์๋ work_๋ผ๋ net::io_context::work๋ฅผ ๋ด์๋ vector์
์์์ ์ธ๊ธํ get_executor()๋ฅผ ํ๋์ฉ ๋ฃ์ด๋๋ค
boost::asio::io_context& io_context_pool::get_io_context()
{
// Use a round-robin scheme to choose the next io_context to use.
boost::asio::io_context& io_context = *io_contexts_[next_io_context_];
++next_io_context_;
if (next_io_context_ == io_contexts_.size())
next_io_context_ = 0;
return io_context;
}
๊ทธ๋ฆฌ๊ณ io_context_pool class์ ๋ด๋ถ ํจ์๋ก get_io_context๋ฅผ ๋์ด
๋ฏธ๋ฆฌ ๊ฐ์ ์ ์ฅํ io_context ๊ฐ์ ๊ฐ์ ธ์ค๋๋ก ๊ตฌํ ๋์ด ์๋ค
์ค์ ์ฝ๋์์ ์ฌ์ฉํ ๋๋ ์๋์ ๊ฐ์ด ์ฌ์ฉํ๋ฉด ๋๋ค
void server::start_accept()
{
new_connection_.reset(new connection(
io_context_pool_.get_io_context(), request_handler_));
acceptor_.async_accept(new_connection_->socket(),
boost::bind(&server::handle_accept, this,
boost::asio::placeholders::error));
}
* ์ฐธ๊ณ ํ Stack overflow ๊ธ *
https://stackoverflow.com/questions/65534284/boost-asio-segfault-in-release-mode
* boost thread pool example *
'๐ C๋ C++' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
Boost::program_options ์ฌ์ฉ๊ธฐ (0) | 2022.07.26 |
---|---|
์ ์ฒ๋ฆฌ๊ธฐ(preprocessor)์ ๋งคํฌ๋ก(macro) (0) | 2022.02.07 |
STRUCT์ UNION์ ์์๋ณด์ (0) | 2021.07.12 |
C++ ์ค๋งํธ ํฌ์ธํฐ๋ฅผ ์์๋ณด์ - (2) shared_ptr (0) | 2021.06.25 |
Error ํด๊ฒฐ: undefined reference to `vtable for XXX' (0) | 2021.06.24 |