簡體   English   中英

與Linux相比,為什么Mac OS X上的pthread_mutex性能如此糟糕?

[英]Why is performance of pthread_mutex so bad on Mac OS X compared to Linux?

我現在正在學習多線程編程,並且我注意到在Mac OS X上使用互斥鎖實現同步的程序非常慢,在某種程度上,通常最好使用單線程。 我知道有很多更快的同步方法,但是我仍然想知道為什么會這樣。 為了進行簡單的時間測量,我編寫了該程序。

#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
#include <sys/time.h>
pthread_mutex_t lock;
long s;
double cur_time() {
  struct timeval tp[1];
  gettimeofday(tp, NULL);
  return tp->tv_sec + tp->tv_usec * 1.0E-6;
}


void * func(){
  int n = 1000000;
  while(n > 0){
  pthread_mutex_lock(&lock);
  s++;
  n --;
  pthread_mutex_unlock(&lock);
}
return 0;
}
void * thread_func(void * arg_){
  return func();
}

int main(){
  pthread_mutex_init(&lock,NULL);
  s = 0;
  int i;
  pthread_t pids[3];

  double t1 = cur_time();
  for(i = 0; i < 3; i++){
    pthread_create(&pids[i],NULL,thread_func,NULL);
  }
  for(i = 0; i < 3; i++){
    pthread_join(pids[i],0);
  }
  printf("s = %ld\n",s);
  double t2 = cur_time();
  printf("Time consumed: %fs\n",t2 - t1);

}

該程序在裝有4GB RAM和Intel Core i5 Dual Core 1.6GHz處理器的MacBook Air(OS X El Capitan)上運行了11.022169秒。 在裝有Ubuntu 14.04、16GB RAM和Intel Core 17 Octal Core 2.4GHz處理器的另一台計算機上,它僅運行了0.493699秒。 我知道這兩台計算機之間的處理能力存在明顯差異,但是我不希望兩者之間的差異如此之大。 此外,在使用其他鎖(例如自旋鎖)時,兩者之間的差別永遠不會這么大。

如果有人能為我提供一些有關這種差異的原因的知識,我將不勝感激。

補充:我錯過了一些東西。 我還分別比較了每個操作系統上的自旋鎖和互斥鎖。 在Linux上,自旋鎖比具有大量線程的互斥鎖要慢得多,而在Mac OS X上,互斥鎖總是要慢得多,相差一到兩位數。

在MacOS上默認情況下,互斥體顯然是作為“一般”互斥體實現的。 不利的一面是會大大降低性能。 參見https://blog.mozilla.org/nfroyd/2017/03/29/on-mutex-performance-part-1/

請注意,當Mozilla嘗試在Mac上切換至FIRSTFIT(未記錄!)時,我們發現了阻止它的問題: https ://bugzilla.mozilla.org/show_bug.cgi?id=1353787#c7

在Linux上,互斥鎖通常是根據futex系統調用來實現的。 在OS X上,鎖定的成本要高得多,因為它需要向內核發送消息。 但是,眾所周知,這很難正確進行基准測試,而且我還沒有檢查您的代碼。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM