首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

C語言多線程同步性能實測:互斥鎖 vs 原子操作 vs 原子鎖 (Windows/Linux 跨平台)

     編輯:關於C語言

C語言多線程同步性能實測:互斥鎖 vs 原子操作 vs 原子鎖 (Windows/Linux 跨平台)

對比三種同步機制在高併發計數器場景下的性能:pthread_mutex、CPU 原子指令、基於原子操作自旋鎖。

測試環境

  • Windows 10 x64 + VS2015 Release x86
  • Ubuntu 15.10 x64 + GCC 5.2.1
  • 50 線程,每線程 2,000,000 次遞增

核心代碼片段

1. pthread_mutex (系統調用、內核態切換)

pthread_mutex_lock(&mx);
++counter;
pthread_mutex_unlock(&mx);

2. Windows 原子操作 InterlockedExchangeAdd (單指令、用戶態)

InterlockedExchangeAdd(&counter, 1); // 原子 fetch-and-add

3. Linux GCC 內建 __sync_fetch_and_add

__sync_fetch_and_add(&counter, 1);

4. 原子自旋鎖 (CAS 循環 + 微睡眠)

// Windows
while (InterlockedExchange(&lock, 1)) Sleep(0);
++counter;
InterlockedExchange(&lock, 0);

// Linux
while (__sync_lock_test_and_set(&lock, 1)) usleep(2);
++counter;
__sync_lock_release(&lock);

性能結果 (越低越好)

平台pthread_mutex原子操作原子自旋鎖
Windows~2.8 秒~0.3 秒~0.2 秒
Linux~2.5 秒~0.25 秒~0.18 秒

原子操作 > 原子自旋鎖 > 互斥鎖 (速度排名)。自旋鎖在低競爭、短臨界區時極快;高競爭下 CPU 空轉浪費,需 usleep/Sleep(0) 讓出時間片。

跨平台原子操作封裝 sc_atom.h

#ifdef _MSC_VER
#define SC_ATOM_ADD(v,a) InterlockedExchangeAdd(&(v),(a))
#define SC_ATOM_LOCK(v) while(InterlockedExchange(&(v),1)) Sleep(0)
#define SC_ATOM_UNLOCK(v) InterlockedExchange(&(v),0)
#elif __GNUC__
#define SC_ATOM_ADD(v,a) __sync_fetch_and_add(&(v),(a))
#define SC_ATOM_LOCK(v) while(__sync_lock_test_and_set(&(v),1)) usleep(2)
#define SC_ATOM_UNLOCK(v) __sync_lock_release(&(v))
#endif

工程建議

  • 簡單計數器/標誌位 → 直接用原子操作 (atomic_int C11 / GCC builtins / Win32 Interlocked)。
  • 複雜臨界區 → pthread_mutex / CRITICAL_SECTION (Windows 輕量級互斥)。
  • 高性能無鎖隊列/環形緩衝 → 原子 CAS + 內存屏障 (__sync_synchronize / MemoryBarrier)。
  • 自旋鎖 usleep 參數需根據 CPU 核心數、負載調優 (典型 1~10μs)。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved