QueueUserAPC
От: кубик  
Дата: 21.07.22 14:08
Оценка:
Всем привет,

В целях ускорения создания потоков наваял thread pool.
Не пойму как правильно ждать что б не было stack overflow ?
Я делаю примерно так:
void worker (* params){
    // delaet work
    ...
    //потом засыпает
    SleepEx (INFINITE,TRUE);
}

void main (){
    // handle получен ранее , всё норм
    QueueUserAPC((PAPCFUNC)worker, handle....

}


Все работает. Только если я брякнусь в worker то увижу длинный стек трейс как будто worker вызывает себя снова и снова.
Если в таком духе, то будет stack overflow.
Не пойму, как делать то ..
Отредактировано 21.07.2022 14:52 кубик . Предыдущая версия . Еще …
Отредактировано 21.07.2022 14:10 кубик . Предыдущая версия .
Re: QueueUserAPC
От: кубик  
Дата: 21.07.22 15:06
Оценка:
Воистину, как напишешь сразу ответ в голову приходит.
В worker если уже запущен как APС то надо просто return, а Sleep только одна копия делает.
Re: QueueUserAPC
От: Maniacal Россия  
Дата: 22.07.22 07:35
Оценка:
Здравствуйте, кубик, Вы писали:

ИМХО, если в коде есть sleep или goto, то изначально задумка неверная для C++. Есть и другие способы синхронизации и ветвления.
Re[2]: QueueUserAPC
От: кубик  
Дата: 22.07.22 12:58
Оценка:
M>ИМХО, если в коде есть sleep или goto, то изначально задумка неверная для C++. Есть и другие способы синхронизации и ветвления.
Есть есть, но надо учитыввать также и сложность переделки ... goto вообще норм из вложенностьей выходить.
без Sleep(0) тоже плохо. Уж не надо в абсолют возводить.
Re[3]: QueueUserAPC
От: Maniacal Россия  
Дата: 22.07.22 13:11
Оценка:
Здравствуйте, кубик, Вы писали:

M>>ИМХО, если в коде есть sleep или goto, то изначально задумка неверная для C++. Есть и другие способы синхронизации и ветвления.

К>Есть есть, но надо учитыввать также и сложность переделки ... goto вообще норм из вложенностьей выходить.
К>без Sleep(0) тоже плохо. Уж не надо в абсолют возводить.

goto в ассемблере незаменим. В C++ — моветон. А вместо Sleep(0) давно есть std::this_thread::yield(). Толку, правда, столько же.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.