使用互斥锁时,CPU时间高于挂钟时间

时间:2019-04-26 08:18:37

标签: cpu mutex

我正在C语言中使用此算法来学习线程和互斥锁。

#define NUM_THREADS 2
uint64_t count = 0;
pthread_mutex_t lock = PTHREAD_MUTEX_INITIALIZER;

static void *task (void *arg) {
   for (uint32_t i = 0; i < 4000000; ++i) {
      pthread_mutex_lock(&lock);
      count += 1;
      pthread_mutex_unlock(&lock);
   }
   pthread_exit(NULL);
}

int main (void) {
   struct timespec ts1, ts2, tw1, tw2;
   pthread_t threads[NUM_THREADS];

   clock_gettime(CLOCK_PROCESS_CPUTIME_ID, &ts1);
   clock_gettime(CLOCK_MONOTONIC, &tw1);

   for (int i = 0; i < NUM_THREADS; ++i) {
      pthread_create (&threads[i], NULL, task, NULL);
   }

   for (int i = 0; i < NUM_THREADS; ++i) {
      pthread_join(threads[i], NULL);
   }

   clock_gettime(CLOCK_PROCESS_CPUTIME_ID, &ts2);
   clock_gettime(CLOCK_MONOTONIC, &tw2);

   double cpu = 1000.0*ts2.tv_sec + 1e-6*ts2.tv_nsec - (1000.0*ts1.tv_sec + 1e-6*ts1.tv_nsec);
   double wall = 1000.0*tw2.tv_sec + 1e-6*tw2.tv_nsec - (1000.0*tw1.tv_sec + 1e-6*tw1.tv_nsec);

   printf("CPU time used: %.2f ms\n", cpu);
   printf("Wall clock time: %.2f ms\n", wall);
   printf("%" PRIu64 "\n", count);

   return 0;
}

应该用来说明互斥的原理。 main函数创建两个线程,第一个锁定互斥锁并递增count变量。然后,第一个线程解锁互斥锁,第二个线程发挥作用,并执行与第一个线程相同的操作。

但是日志显示如下:

CPU time used: 1021.23 ms
Wall clock time: 518.50 ms
8000000

我了解挂钟时间是程序开始到结束之间(我们可以测量)的时间。 CPU时间基本上就是CPU在程序上花费的时间。

尽管我使用的是四核处理器,但我知道CPU时间可能比挂钟时间长,不使用互斥锁

那么,为什么在使用互斥锁时CPU时间更长?等待互斥锁解锁时,CPU是否应该“挂起”?

谢谢。

0 个答案:

没有答案