unclechu
@unclechu

Как синхронизировать libuv код?

Есть просто пример (ниже). Проблема в том, что мне нужно внутри process дождаться завершения кода в after, каким образом это правильно реализовать? Не while-loop в конце-же-концов делать?
uv_work_t *baton;

void work(uv_work_t* task) {}

void after(uv_work_t* task, int status) {
    printf("after\n");
    delete task;
}

int process()
{
    baton = new uv_work_t();
    uv_queue_work(uv_default_loop(), baton, work, after);
    printf("before\n");
    return 0;
}

P.S. Сам process выполняется в отдельном потоке через pthread.
  • Вопрос задан
  • 2948 просмотров
Решения вопроса 1
jcmvbkbc
@jcmvbkbc
"I'm here to consult you" © Dogbert
Завести семафор (uv_sem_*), который ждать в process а взводить в after. Типа того:
static uv_sem_t sem;
uv_work_t *baton;

void work(uv_work_t* task) {}

void after(uv_work_t* task, int status) {
    printf("after\n");
    delete task;
    uv_sem_post(&sem);
}
int process()
{
    baton = new uv_work_t();
    if (uv_sem_init(&sem, 0) < 0) {
        perror("uv_sem_init");
        return -1;
    }
    uv_queue_work(uv_default_loop(), baton, work, after);
    printf("before\n");
    uv_sem_wait(&sem);
    uv_sem_destroy(&sem);
    return 0;
}


Но возникает вопрос: нафига использовать асинхронный фреймворк там, где нужно синхронное выполнение работы? Нельзя ли просто вызвать work из process?
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

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