我想知道如果不是多线程上下文,pthread_mutex_lock和pthread_mutex_unlock会造成多少开销,所以我编写了一个演示:
#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实际上做了什么从而导致了开销?
发布于 2018-03-21 04:09:59
这里肯定有类似的问题和答案,但我将在这里提供几个信息点。
首先,通常情况下,互斥体的最大成本是至少有2个线程用力锤击互斥体。没有竞争的互斥是不昂贵的,基本上它可以用原子标志来实现。
另一个事实是互斥带来了实现障碍,例如顺序一致性。粗略地说,如果在另一个CPU核心上运行的另一个线程读取关键部分中一个线程写入的数据,则必须在互斥锁下通过总线发布该数据,以确保其他处理器/CPU内核的缓存看到数据。
https://stackoverflow.com/questions/49397588
复制相似问题