Size: a a a

2020 May 10

AM

Alex Master in pro.cxx
всё что мне приходит в голову это глобальная cond_var с глобальным мьютексом
источник

A

Alex in pro.cxx
если чисто стандартными средствами, то в потоковой функции должны быть предусмотрены точки, где можно взять мьютекс или проверить condition_variable
источник

VK

Valentin Kornienko in pro.cxx
Alex Master
всё что мне приходит в голову это глобальная cond_var с глобальным мьютексом
Хм. Так-то почему не взять что-то не стдшное?
источник

A

Alex in pro.cxx
Alex Master
всё что мне приходит в голову это глобальная cond_var с глобальным мьютексом
ну зачем глобальная, можно же передать в поток одним из нескольких разных способов
источник

AM

Alex Master in pro.cxx
Alex
ну зачем глобальная, можно же передать в поток одним из нескольких разных способов
да, такое возможно
источник

A

Alex in pro.cxx
через инстанс класса, через захват в лямбду потока
источник

A

Alex in pro.cxx
но суть такая же, да
источник

A

Alex in pro.cxx
В винде есть функция SuspendThread, ей можно любой поток просто по id застопорить
источник

A

Alex in pro.cxx
а потом ResumeThread
источник

AM

Alex Master in pro.cxx
спасибо, гляну
источник

ПК

Побитый Кирпич... in pro.cxx
Alex Master
добрый день. есть простейший thread pool. есть ли возможность моментально замораживать потоки, а потом так же моментально их восстанавливать на том же месте работы для продолжения? про существование mutex, cond_var, lock, atomic я знаю. вопрос в том, как это лучше организовать, и вообще возможно ли?
Зачем?
источник

AM

Alex Master in pro.cxx
это уже скорее философский вопрос)
источник

ПК

Побитый Кирпич... in pro.cxx
Alex Master
это уже скорее философский вопрос)
Это XY problem вопрос
источник

AM

Alex Master in pro.cxx
Побитый Кирпич
Это XY problem вопрос
хорошо. допустим у нас есть симуляция, в которой есть общая очередь объектов перед конвейером. распределитель берёт объект с головы очереди, определяет его на нужную ветвь (отдельный поток) и запускает задачу для его обработки. необходима возможность остановить симуляцию в конкретный момент времени, чтобы после этой команды никакие действия не происходили.
источник

ПК

Побитый Кирпич... in pro.cxx
Alex Master
хорошо. допустим у нас есть симуляция, в которой есть общая очередь объектов перед конвейером. распределитель берёт объект с головы очереди, определяет его на нужную ветвь (отдельный поток) и запускает задачу для его обработки. необходима возможность остановить симуляцию в конкретный момент времени, чтобы после этой команды никакие действия не происходили.
while (in_progress) {
   current_simulation.next_step();
}
Пауза - установка in_progress в false
источник

AM

Alex Master in pro.cxx
Побитый Кирпич
while (in_progress) {
   current_simulation.next_step();
}
Пауза - установка in_progress в false
а потом выход из цикла и всё?
источник

AM

Alex Master in pro.cxx
а как продолжить?
источник

ПК

Побитый Кирпич... in pro.cxx
Alex Master
а как продолжить?
while (in_progress) {
 if (in_pause) {
   std::this_thread::sleep_for(100ms);
 } else {
   current_simulation.next_step();
 }
}

Поторопился
источник

AM

Alex Master in pro.cxx
Побитый Кирпич
while (in_progress) {
 if (in_pause) {
   std::this_thread::sleep_for(100ms);
 } else {
   current_simulation.next_step();
 }
}

Поторопился
так а сама симуляция происходит в разных потоках. где тут попытка их остановить?
источник

ПК

Побитый Кирпич... in pro.cxx
Alex Master
так а сама симуляция происходит в разных потоках. где тут попытка их остановить?
Значит каждому потоку отправляется in_pause сигнал, путём установки этой переменной в true
источник