【问题标题】:overhead of pthread_mutex_lock and pthread_mutex_unlockpthread_mutex_lock 和 pthread_mutex_unlock 的开销
【发布时间】:2018-03-21 03:21:19
【问题描述】:

我想知道如果不是多线程上下文,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 究竟做了什么导致开销?

【问题讨论】:

    标签: linux pthreads mutex


    【解决方案1】:

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-08-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-09-25
      • 2018-10-29
      • 2017-11-08
      相关资源
      最近更新 更多