Использовать while () + sleep () вместо семафора или мьютекса? - PullRequest
0 голосов
/ 27 октября 2019

Я работаю с потоками, и иногда мне нужно остановить один поток, ожидая завершения другого. Иногда я использую семафор, чтобы предотвратить возврат функции в другом потоке до ее завершения (например, ожидание выключения камеры устройства). Проблема в том, что иногда функция вызывается в главном потоке, и она блокирует приложение, пока не вернется. В этом случае я мог бы использовать цикл while, который вызывает sleep (), чтобы не показывать пользователю «вращающийся пляжный мяч». Есть ли лучшее решение для этого, которое предотвратит пляжный мяч?

1 Ответ

0 голосов
/ 27 октября 2019

Я не знаю, можно ли использовать потоки posix на Android, если да, взгляните на pthread_cond_timedwait :

static pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
static pthread_cond_t cond = PTHREAD_COND_INITIALIZER; 

void *timer_handler(void *handler)
{
    struct timespec end;

    clock_gettime(CLOCK_REALTIME, &end);

    end.tv_sec += 5;

    int stop = 1;

    pthread_mutex_lock(&mutex)

    int error = pthread_cond_timedwait(&cond, &mutex, &end); // Wait 5 seconds

    if (error == ETIMEDOUT)
    {
        stop = 0;
    }
    else if (error != 0)
    {
        perror("pthread_cond_timedwait");
        exit(EXIT_FAILURE);
    }

    pthread_mutex_unlock(&mutex)

    if (stop == 0)
    {
        // Do your stuff here
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...