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 ответов

65 просмотров

А что не работает? Виснет в деструкторе 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)"

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

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

30500 за редактор? )
Владимир
47
Недавно Google Project Zero нашёл багу в SQLite с помощью LLM, о чём достаточно было шумно в определённых интернетах, которые сопровождались рассказами, что скоро всех "ибешни...
Alex Sherbakov
5
вы делали что-то подобное и как? может есть либы готовые? увидел картинку нокода, где всё линиями соединено и стало интересно попробовать то же в ddl на lua сделать. решил с ч...
Victor
8
Подскажите пожалуйста, как в CustomDrawCell(Sender: TcxCustomGridTableView; ACanvas: TcxCanvas; AViewInfo: TcxGridTableDataCellViewInfo; var ADone: Boolean); получить наз...
A Z
7
Ребят в СИ можно реализовать ООП?
Николай
33
https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_h_common.erl#L174 https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_olp.erl#L76 15 лет назад...
Maksim Lapshin
20
Раз начали говорить про embassy, то присоединюсь со своими парой вопросов. 1) Есть ли сопоставимые аналоги для асинхронного кода в emdebbed? 2) Можно ли внутри задач embassy ...
NI_isx
6
Как передать управляющий символ в открытую через CreateProcess консоль? Собсна, есть процедура: procedure TRedirectThread.WriteData(Data: OEMString); var Written: Cardinal;...
Serjone
1
Он в одиночку это дело запилил или была какая-то команда?
Aquinary
12
~ 2m21s  nix shell github:nixos/nixpkgs#stack ~  stack ghc -- --version error: … while calling the 'derivationStrict' builtin at /builtin/derivation.nix:...
Rebuild your mind.
6
Карта сайта