Может быть, только один работник ждет, пока условие станет истинным.
Если два или более рабочих бодрствуют (notifyAll), они должны снова проверить это условие. в противном случае все работники продолжали бы работать, хотя могут быть только данные для одного из них.
Для микросекундного разрешения вы можете использовать gettimeofday()
. При этом используется «время настенных часов», которое продолжает увеличиваться, когда устройство спит, но подвержено внезапным сдвигам вперед или назад, если сеть обновляет часы устройства.
Вы также можете использовать clock_gettime(CLOCK_MONOTONIC)
. При этом используются монотонные часы, которые никогда не прыгают вперед или назад, но перестают считать, когда устройство спит.
Фактическое разрешение таймеров зависит от устройства.
Оба они являются API-интерфейсами POSIX, а не специфичными для Android.
Для ленивых, добавьте это в начало вашего кода:
#include <time.h>
// from android samples
/* return current time in milliseconds */
static double now_ms(void) {
struct timespec res;
clock_gettime(CLOCK_REALTIME, &res);
return 1000.0 * res.tv_sec + (double) res.tv_nsec / 1e6;
}
Назовите это так:
double start = now_ms(); // start time
// YOUR CODE HERE
double end = now_ms(); // finish time
double delta = end - start; // time your code took to exec in ms
Еще одна для ленивых, эта функция возвращает текущее время в наносекундах, используя CLOCK_MONOTONIC
#include <time.h>
#define NANOS_IN_SECOND 1000000000
static long currentTimeInNanos() {
struct timespec res;
clock_gettime(CLOCK_MONOTONIC, &res);
return (res.tv_sec * NANOS_IN_SECOND) + res.tv_nsec;
}