Ответ 1
Вы можете запрограммировать это так:
- Использование атоматики и цикла опроса.
- Использование
condition_variable
.
Я закодировал это для вас ниже. В моей системе я могу контролировать в режиме реального времени, сколько процессор использует данный процесс.
Сначала с петлей опроса:
#include <atomic>
#include <chrono>
#include <iostream>
#include <thread>
std::atomic<bool> is_ready(false);
void
test()
{
std::this_thread::sleep_for(std::chrono::seconds(30));
is_ready.store(true);
}
int
main()
{
std::thread t(test);
while (!is_ready.load())
std::this_thread::yield();
t.join();
}
Для меня это занимает 30 секунд, и при выполнении процесса занимает около 99,6% от процессора.
Альтернативно с condition_variable
:
#include <chrono>
#include <condition_variable>
#include <iostream>
#include <mutex>
#include <thread>
bool is_ready(false);
std::mutex m;
std::condition_variable cv;
void
test()
{
std::this_thread::sleep_for(std::chrono::seconds(30));
std::unique_lock<std::mutex> lk(m);
is_ready = true;
cv.notify_one();
}
int
main()
{
std::thread t(test);
std::unique_lock<std::mutex> lk(m);
while (!is_ready)
{
cv.wait(lk);
if (!is_ready)
std::cout << "Spurious wake up!\n";
}
t.join();
}
Это то же самое поведение, за исключением того, что во время выполнения 30 секунд процесс принимает 0.0% CPU. Если вы пишете приложение, которое может выполняться на устройстве с батарейным питанием, последнее почти бесконечно легче на батарее.
Теперь, по общему признанию, если у вас была очень плохая реализация std::condition_variable
, она могла иметь такую же неэффективность, как цикл опроса. Однако на практике такой поставщик должен быстро выйти из бизнеса.
Обновление
Для усмешек я увеличил свой цикл wait_variable wait с ложным детектором пробуждения. Я снова побежал, и ничего не распечатывал. Не одно побочное пробуждение. Это, конечно, не гарантируется. Но он демонстрирует, что может достичь качественная реализация.