首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >pthread_mutex_lock和pthread_mutex_unlock的开销

pthread_mutex_lock和pthread_mutex_unlock的开销
EN

Stack Overflow用户
提问于 2018-03-21 03:21:19
回答 1查看 473关注 0票数 2

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

代码语言:javascript
复制
#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;
}

产出如下:

代码语言:javascript
复制
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实际上做了什么从而导致了开销?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-03-21 04:09:59

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

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

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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49397588

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档