gpt4 book ai didi

linux - pthread_mutex_lock 和 pthread_mutex_unlock 的开销

转载 作者:太空宇宙 更新时间:2023-11-04 10:10:29 25 4
gpt4 key购买 nike

我想知道如果不是多线程上下文,pthread_mutex_lock和pthread_mutex_unlock会造成多少开销,所以我写了一个demo:

#include <pthread.h>
#include <stdio.h>
#include <time.h>

pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
#define LOOP_COUNT 1000000000

int main(int argc, char* argv[])
{
time_t cur_time = time(NULL);
double d = 0.0;
printf("%s", asctime(localtime(&cur_time)));
for (int i = 0; i < LOOP_COUNT; ++i) {
pthread_mutex_lock(&mutex);
d += 0.1;
pthread_mutex_unlock(&mutex);
}
cur_time = time(NULL);
printf("%s", asctime(localtime(&cur_time)));
d = 0.0;
for (int i = 0; i < LOOP_COUNT; ++i) {
d += 0.1;
}
cur_time = time(NULL);
printf("%s", asctime(localtime(&cur_time)));
return 0;
}

输出是:

Wed Mar 21 10:58:25 2018
Wed Mar 21 10:58:41 2018
Wed Mar 21 10:58:43 2018

那么,开销真的存在吗?如果是,pthread_mutex_lock 和 pthread_mutex_unlock 究竟做了什么导致了开销?

最佳答案

SO 上肯定有类似的问题和答案,但我会在这里提供几个信息点。

首先,通常情况下,互斥体的最大成本是至少有 2 个线程在用力攻击互斥体。无竞争的互斥量并不昂贵,本质上它可以根据原子标志来实现。

另外一个事实是,互斥量存在实现障碍,例如顺序一致性。粗略地说,如果在另一个 CPU 内核上运行的另一个线程读取关键部分中一个线程写入的数据,则该数据必须在互斥锁解锁时通过总线发布,以确保其他处理器/CPU 内核的缓存能够看到数据。

关于linux - pthread_mutex_lock 和 pthread_mutex_unlock 的开销,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49397588/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com