Size: a a a

2021 July 01

EP

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

 P

 ‌‌Gleb Pilipets... in pro.cxx
Хм, а это откуда такое требование?
источник

D

Dmitriy in pro.cxx
Банальный .detach() тогда стал бы УБ :)
источник

EP

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

D

Dmitriy in pro.cxx
Исполнение не заканчивается мейном
источник

EP

Egor Pugin in pro.cxx
но потоки нужно завершить до него
источник

D

Dmitriy in pro.cxx
.
источник

 P

 ‌‌Gleb Pilipets... in pro.cxx
Так а как тогда сделать Singletone? Там же в любом случае что-то да будет static.

Я понимаю, что использовать его плохо и т.д.
Но суть в том, что мне нужно подгрузить .dll, то есть я не могу сделать Component Injection и т.д.
источник

EP

Egor Pugin in pro.cxx
долгоживущие объекты нужно размещать в специальных "контекстах" - структурах на всю библиотеку
источник

EP

Egor Pugin in pro.cxx
можно посмотреть сишные либы, когда сначала инициализируется сама библиотека или её контекст, в конце он должен быть очищен. Это и есть то место, где лежат все "статичные" переменные
источник

 P

 ‌‌Gleb Pilipets... in pro.cxx
А эту очистку, инициализацию можно сделать на уровне .dll где-то здесь?


{
   switch (ul_reason_for_call)
   {
   case DLL_PROCESS_ATTACH:
   case DLL_THREAD_ATTACH:
   case DLL_THREAD_DETACH:
   case DLL_PROCESS_DETACH:
       break;
   }
   return TRUE;
}

Или она должна делатся из-вне?
источник

EP

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

EP

Egor Pugin in pro.cxx
если вдруг с виндой
источник

EP

Egor Pugin in pro.cxx
в аттаче происходит инит
источник

D

Dmitriy in pro.cxx
Можно. Но инициализация - с нюансами
источник

EP

Egor Pugin in pro.cxx
однако в этом случае не получится создать несколько отдельных экземпляров ("контекстов") библиотеки. Это ограничение, поэтому лучше отдать пользователю
источник

D

Dmitriy in pro.cxx
источник

 P

 ‌‌Gleb Pilipets... in pro.cxx
Типа у меня запущенный .exe, куда я подгружаю свой проект MainProject как .dll.

Сейчас я хочу создать ещё одну .dll - DependencyProject, которая будет использоваться в MainProject.

Поэтому инициализацию извне .dll я не могу сделать, так там через UI запущенного .exe идёт подгрузка MainProject .dll - то есть за подгрузку не мой код отвечает. Я могу лишь на уровне .dll что-то сделать.
источник

 P

 ‌‌Gleb Pilipets... in pro.cxx
Хех, я попробовал заменить ту логику с io_context на msg_queue и condition_variable по принципу ниже, но работа осталась некоректной.
Прога не зависает, но все равно работает некорректно при статической инициализации: завершается слишком быстро, а при детальном дебаге вообще падает на системных либах.

bool job_finished;
std::mutex post_mutex;
std::queue<std::function<void ()>> msg_queue;
std::thread worker_thread;
std::condition_variable cv;

Поэтому нужно фиксить static инициализацию.

Я посмотрел здесь примеры https://docs.microsoft.com/en-us/windows/win32/dlls/dynamic-link-library-best-practices, но не увидел, как именно правильно инициализировать контекст.
Тип где хранить эти context variables и т.д. - кто-то может подсказать мануал?
источник

IZ

Ilia Zviagin in pro.cxx
Выясняй где и почему падает, тогда поймешь...
источник