Подтвердить что ты не робот

Как выполнить std:: thread sleep

Я новичок в std:: thread. Мне нужно поставить поток для сна из другого потока, возможно ли это? В примерах все, что я вижу, это код вроде:

std::this_thread::sleep_for(std::chrono::seconds(1));

Но то, что я хочу сделать, это что-то вроде:

std::thread t([]{...});
t.sleep(std::chrono::seconds(1));

или   sleep(t, std::chrono::seconds(1));

Любые идеи?

4b9b3361

Ответ 1

Поскольку sleep_for является синхронным, он действительно имеет смысл в текущем потоке. Вы хотите, чтобы приостановить/возобновить другие темы. Стандарт не предоставляет способ сделать это (afaik), но вы можете использовать зависящие от платформы методы, используя native_handle.

Например, в Windows, SuspendThread и ResumeThread.

Но более важно то, что почти никогда не нужно это делать. Обычно, когда вы сталкиваетесь с основными вещами, которые вам нужны, стандарт не предоставляет, это красный флаг, который вы идете вниз по опасному пути проектирования. Подумайте о том, чтобы выполнить свою большую цель по-другому.

Ответ 2

Нет. Стандарт не дает вам такого объекта, и он не должен. Что делает сон? Он приостанавливает выполнение заданного потока в течение как минимум заданного промежутка времени. Могут ли другие потоки, возможно, знать, не синхронизируя, что данный поток можно спать, чтобы добиться лучшей производительности?

Нет. Вам нужно будет предоставить синхронизированный интерфейс, который будет противодействовать увеличению производительности от потоков. Единственный поток, который имеет необходимую информацию, нормально ли спать, является самой нитью. Поэтому std::thread не имеет члена sleep, а std::this_thread - один.