[英]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.