C ++, как понять, что мьютекс непропорционально захвачен одним потоком при блокировке других потоков - PullRequest
1 голос
/ 08 ноября 2019

Я хочу проанализировать, как определенный мьютекс распределяется по времени между двумя потоками. Я пытаюсь отладить проблему, когда я чувствую, что один из потоков блокируется / разблокируется очень быстро, что может приводить к тому, что другой поток не сможет получить эту блокировку.

Подробности:

Поток T1:

while (1) {
  //...non-blocking trivial work

  lock();
  //do little work on a shared DS1
  unlock();

  //...blocking work
}

Поток T2:

run() {
   //...does a bunch of blocking work

   lock();
   // update shared DS1
   unlock();

   return;
}

Поток T1 - это поток диспетчера, очень часто проверяющий, обновлен ли общий DS1. Поток T2 выполняет намного больше работы и, наконец, обновляет общий DS1.

Я чувствую, что T1 значительно блокирует блокировку, в то время как T2 не может получить блокировку достаточно быстро.

Я хочу измерить, наскольковремя, когда конкретный поток удерживает эту блокировку. Сколько времени тратит Т2 на борьбу за блокировку.

1 Ответ

2 голосов
/ 08 ноября 2019

Должно быть довольно просто измерить, сколько времени Т2 тратит на ожидание возврата вызова lock ():

// Thread T2
run() {
   //...does a bunch of blocking work

   // use whatever get-current-time API you like here
   const uint64_t t1 = get_current_time_in_microseconds();  
   lock();
   const uint64_t t2 = get_current_time_in_microseconds();

   const uint64_t time_spent_waiting_for_lock = (t2-t1);

   // Add code here to calculate minimum/average/max values 
   // of time_spent_waiting_for_lock over the course of your test

   // update shared DS1
   unlock();

   return;
}
...