Как измерить время, необходимое потоку, чтобы пройти условную переменную? - PullRequest
1 голос
/ 29 марта 2019

Я хочу смоделировать систему бронирования в театре, где клиенты общаются с операторами, чтобы забронировать места в C. Я использую библиотеку pthread.Когда поток создается, он пытается получить мьютекс переменной, содержащей число доступных операторов, и проверяет, доступен ли какой-либо оператор (с использованием условной переменной), и если нет, поток переходит в спящий режим.Я хочу знать, сколько времени понадобилось потоку, чтобы соединиться с оператором, т.е. сколько времени потребовалось потоку, чтобы пройти переменную условия.Могу ли я просто использовать таймер в начале потока и сразу после условной переменной, или это не сработает, потому что, когда поток заблокирован, таймер тоже блокируется?Если это так, как правильно это сделать?Спасибо.

    void* thread_transaction(void* arg) //the function passed to 
    pthread_create
    {
      //instantiating variables and such...

      //reserving an operator
      pthread_mutex_lock(&tel_mut);
      while(threadData->available_tel <= 0) 
        pthread_cond_wait(&tel_cond, &tel_mut);

      //can I put a timer at the start and right here and accurately 
      //measure the time?

1 Ответ

1 голос
/ 29 марта 2019

Предполагая, что вы пишете для Posix-совместимой системы (например, Linux), вы можете использовать clock_gettime() до и после цикла ожидания и вычитать время начала из времени окончания, чтобы истекать время. Вы захотите использовать настенные часы, а не часы процессора. Так как эта функция помещает свой результат в struct timespec, который представляет собой значение из двух частей, вычитание не является тривиальным (но и не особенно сложным): вам необходимо рассмотреть случай, когда вычитание наносекундных полей приводит к отрицательному числу .

Разница между CLOCK_REALTIME и CLOCK_MONOTONIC заключается в том, что на монотонные часы не влияют корректировки часов хоста, необходимые для синхронизации со службой времени. (Другое отличие состоит в том, что нет никакой информации о том, что представляет собой значение, возвращаемое CLOCK_MONOTONIC, в терминах календаря, поскольку оно обычно начинает отсчитываться при загрузке системы. Однако разница между двумя значениями полностью значима.)

...