Size: a a a

2021 July 01

 P

 ‌‌Gleb Pilipets... in pro.cxx
Ну там, где использую .dll...

#include <MyClass.h>
#include <boost/asio/deadline_timer.hpp>

int main() {
MyClass& ins = MyClass::getInstance();

ins.ioc.post([&] {
 boost::system::error_code err;
 boost::asio::deadline_timer(ins.ioc, boost::posix_time::milliseconds(1000)).wait(err);
});
return 0;
}
источник

IZ

Ilia Zviagin in pro.cxx
Вот это висит при статической инициализации, но работает без проблем, если сделать MyClass ins.

В каком месте висит?
источник

 P

 ‌‌Gleb Pilipets... in pro.cxx
boost::asio::deadline_timer(ins.ioc, boost::posix_time::milliseconds(1000)).wait(err);

Ну вот на этой строке
источник

 P

 ‌‌Gleb Pilipets... in pro.cxx
То есть если не делать static, то пройдёт секунда и всё завершится, а если сделать static, то оно виснет просто...
источник

IZ

Ilia Zviagin in pro.cxx
Ну, так это же wait, он должен вроде как висеть ?
(не знаю ASIO, у меня бессмысленно спрашивать)
источник

 P

 ‌‌Gleb Pilipets... in pro.cxx
ну да, он должен заблокироваться на 1 секунду, а не непонятно, сколько...
источник

 P

 ‌‌Gleb Pilipets... in pro.cxx
тип я же говорю, что если без static, то этот таймер заблочит выполнение на секунду и прога завершится, как и ожидается...

Если со static, то проходит и 30 секунд, а прога не завершается.
Если сделать паузу дебагером, то работает какая-то логика в include\boost\asio\detail\impl\win_iocp_io_context.ipp
источник

EP

Egor Pugin in pro.cxx
у тебя объект разрушается после выхода из мейна, это нежелательно
https://pastebin.com/WsNifxy6
источник

 P

 ‌‌Gleb Pilipets... in pro.cxx
ну я бы ожидал, что он зависнет в деструкторе до завершения работы io_context на worker_thread.join();
MyClass::~MyClass()
{
work_guard.reset();
worker_thread.join();
}
источник

 P

 ‌‌Gleb Pilipets... in pro.cxx
И тогда разрушится - почему это проблема?
источник

EP

Egor Pugin in pro.cxx
ио контекст не завершается, как видишь
источник

 P

 ‌‌Gleb Pilipets... in pro.cxx
ну вот да, но почему?
Тип если не делать static, то всё же работает )
источник

EP

Egor Pugin in pro.cxx
не делать глобальных переменных, не делать статиков
источник

D

Dmitriy in pro.cxx
Вопрос в том, почему
источник

EP

Egor Pugin in pro.cxx
потому что в комплишн порт после выхода из мейна уже что-то не успевает прийти, что его ОС не может закрыть
источник

D

Dmitriy in pro.cxx
Вопрос - что?))
источник

EP

Egor Pugin in pro.cxx
ну поковыряйся в виндовых рантаймах
источник

 P

 ‌‌Gleb Pilipets... in pro.cxx
ну эта проблема именно при использовании .dll возникает - если убрать .dll и оставить static, то оно сработает.
источник

EP

Egor Pugin in pro.cxx
что там они делают
источник

EP

Egor Pugin in pro.cxx
банально - все потоки должны завершаться до выхода из мейна
источник