我正在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是否应该“挂起”?
谢谢。