170 похожих чатов

#Include <iostream> using namespace std; #include <chrono> #include <thread> #include <mutex> #include <queue> #include <condition_variable> using namespace

std::chrono;
using namespace std;

template<typename F>
struct Job {
time_point<system_clock> time_to_exec;
F func;
};

template<typename F>
inline bool operator<(const Job<F> &lhs, const Job<F> &rhs) {
return lhs.time_to_exec < rhs.time_to_exec;
};

struct Executor
{
Executor() {
runner = thread(&Executor::running, this);
}

~Executor() {
unique_lock<mutex> lock(queue_mutex);
stop = true;
runner.join();
}

void running() {
while(not stop) {
unique_lock<mutex> lock(queue_mutex);

if(jobs.empty()) {
cv.wait(lock, [this] () {not jobs.empty() || stop;});
} else if (jobs.top().time_to_exec > system_clock::now()) {
cv.wait_until(lock, jobs.top().time_to_exec, [this]() {not jobs.empty() || stop;});
} else {
auto job = jobs.top();
jobs.pop();
lock.unlock();

job();
}
}
}

template<typename F>
void exec(F f, milliseconds timeout) {
Job job(f, system_clock::now() + timeout);

unique_lock<mutex> lock(queue_mutex);
jobs.push(job);
cv.notify_one();
}

priority_queue<Job<F>> jobs; // <-----------?... o_O
mutex queue_mutex;
condition_variable cv;
thread runner;
bool stop = false;
};

string str = "1234567";
int foo(int 5) {
cout << "out finally!" << str[5] << endl;
};

int main()
{
Executor executor;
executor.exec([](){cout << "out finally!";}, seconds{5});
executor.exec(&foo, 5, seconds{7});
cout<<"Hello World";

return 0;
}

21 ответов

36 просмотров

А что не работает? Виснет в деструкторе Executor?

Я удалил твой пост с длинной ссылкой, сори. Если надо - пришли как-то по-другому

Vladimir- Автор вопроса
Alexander Pshenichnikov
А что не работает? Виснет в деструкторе Executor?

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

Vladimir
Не компилится. Получается, Job при создание параме...

Гляньте тут, сравните со своим кодом https://godbolt.org/z/xdKoqExzo

Vladimir- Автор вопроса
Alexander Pshenichnikov
Гляньте тут, сравните со своим кодом https://godb...

Вау) Здорово) Спасибо) Т.е. Executor<std::function<void()>> executor; std::function<void()> - как общий тип F, под который подходит любая сигнатура функции? Что обычной, что передаваемой с параметрами, обёрнутая в bind?

Vladimir
Не компилится. Получается, Job при создание параме...

А как ты собираешься эти разные функции вызывать потом ? Надо сводить это всё к одному виду функций

Vladimir
Вау) Здорово) Спасибо) Т.е. Executor<std::function...

Да, std::function<void()> - "универсальный" тип для жобы без аргументов и возвращающей void.

Vladimir- Автор вопроса
Alexander Pshenichnikov
Да, std::function<void()> - "универсальный" тип дл...

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

Vladimir- Автор вопроса

Ну вот в этом и загвоздка была. Что я не знал о таком универсальном типе.

Vladimir- Автор вопроса

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

Vladimir
Ну вот в этом и загвоздка была. Что я не знал о та...

Не совсем понял в отношении универсальный. Это же конкретная сигнатура, ничего не принимает, ничего не отдает.

Vladimir
И что к такой функции можно свести любые типы функ...

А ты имеешь ввиду универсальный в том плане, что в нее можно передать не только голую функцию, а например, класс, с оператором "функция" (часто именуемый функтор), это да. Но сигнатура должна четко совпадать.

Vladimir- Автор вопроса
The Pressbraker
А ты имеешь ввиду универсальный в том плане, что в...

Ну да. Спасибо Александру. Сейчас классно получилось, что можно передать: void foo(); и void bar(int x, char y) и лямбду похожей сигнатуры Если нужно возвращаемое значение - это уже, наверное, по-другому реализовывать. Видел что-то похожее с выдачей пользователю future. Т.е. асинхронно/параллельно исполнили и положили результат. Сверху/в другом ожидающем потоке просто future.get() - забираешь результат.

Vladimir
Ну да. Спасибо Александру. Сейчас классно получило...

Я не знал, что в std::function<void()> можно положить void bar(int x, char y). Буду знать. Спасибо.

Alexander Pshenichnikov
Да, std::function<void()> - "универсальный" тип дл...

А где про это почитать? На cppref не вижу, вроде

Андрей Таусинов
А где про это почитать? На cppref не вижу, вроде

Так статья про std::function. ... is a general-purpose polymorphic function wrapper... https://en.cppreference.com/w/cpp/utility/functional/function

Alexander Pshenichnikov
Так статья про std::function. ... is a general-pur...

не, именно про то, что в std::function<void()> можно класть любые функции

Ну, не любые вообще. Без аргументов и без возвращаемого значения. В той же статье написно

Alexander Pshenichnikov
Ну, не любые вообще. Без аргументов и без возвраща...

А, все-таки без аргументов, тогда все нормально. Просто в https://t.me/supapro/1353545 меня смутило "Я не знал, что в std::function<void()> можно положить void bar(int x, char y)"

Похожие вопросы

Обсуждают сегодня

а зачем этот вопрос для удаления из чата?
Mёdkinson Medvezhkin
63
Добрый день. Хочу сделать отрисовку по команде на панели. Почему-то рисуется только при втором вызове. С чем может быть связано, не подскажете? procedure TForm1.FormDblClick(...
Kirill Filippenok
20
I just installed it but how do I use it?
Talula
12
Всем доброго дня! Подскажите может кто использовал связку Pagebuilder + Clientsetting. Сами параметры с типом pagebuilder в модуле Clientsetting работают нормально, можно такж...
Александр Добриков
12
Всем привет! Нужен совет от опытных. Переношу свой проект с Делфи 10.2 Токио на Лазарус 3.2 установленный через инсталлятор fpcupdeluxe-x86_64-win64. При импортировании проект...
Дмитрий Завгородний
7
А почему в си некоторые вещи работают с двойными кавычками некоторые с одинарными? Нельзя было все сделать с одними или чтоб работало с разными? например чтоб выводить строки ...
.
15
Всем привет! Подскажите. Я написал приложение на Delphi 10.2 Tokyo под Windows 10. И передо мной стал вопрос о том чтобы сделать это приложение кроссплатформенным (под Linux и...
Дмитрий Завгородний
24
Эх кто-то пришел и весь праздник испортил :( You need complex FBX scene importing setup to change things on import? good luck with that. You need navigation and pathfinding? g...
Serg Gini
5
Good afternoon, I just started learning php in conjunction with mysql. I am registering a system on a local Mamp server using phpMyAdmin. It seems to be stored normally in the...
ManGo
1
я не про это. какая еще есть инфа, или может появиться, что ее можно обозначить названием данной игры? зачем плодить хештеги, которые обозначают одну сущность? в данном случ...
Aiwan \ (•◡•) / _bot
5
Карта сайта