这个系列的原文
Talks in C++ Conference
其他相关资料
自旋锁:更快的 fast path 和更慢的 slow path。
互斥锁:更经济的 slow path 和更慢的 fast path。(即使上锁成功也需要进出内核 syscall)
Futex (Fast Userspace muTexes): Fast path 上锁成功立即返回,slow path 上锁失败执行系统调用睡眠
并非锁本身慢,而是对锁的竞争导致程序慢。使用轻量级锁可以有效提高性能。
pthread_spinlock_t
和 ptthread_mutex_t
;前者属于 busy loop 类型,当没有获得锁时会通过一个 while 循环进行等待;后者当线程无法成功拿到锁时会调用 system_wait
,将当前线程加入到 mutex 对应的等待队列中Exponential Backoff
策略pause
指令也长在此使用,可以优化性能节能减排Benaphore
#include <windows.h>
#include <intrin.h>
class Benaphore
{
private:
LONG m_counter;
HANDLE m_semaphore;
public:
Benaphore()
{
m_counter = 0;
m_semaphore = CreateSeamaphore(NULL, 0, 1, NULL);
}
~Benaphore()
{
CloseHandle(m_semaphore);
}
void Lock()
{
if (_InterlockedIncrement(&m_counter) > 1)
{
WaitForSingleObject(m_semaphore, INFINITE);
}
}
void UnLock()
{
if (_InterlockedDecrement(&m_counter) > 0)
{
ReleaseSeamphore(m_semaphore, 1, NULL);
}
}
}
spin lock
int flag = 0;
void lock()
{
while(__sync_lock_test_and_set(&flag, 1)) {
}
}
void unlock()
{
__sync_lock_release(&flag, 0);
}