mutex, spinlock, cas

1.多線程數(shù)據(jù)共享,資源保護方法:
1)mutex
如果獲取不到鎖,讓出CPU,將線程加入等待隊列。

任務(wù)耗時比上下文切換要長

2)spinlock
如果獲取不到鎖,則繼續(xù)死循環(huán)檢查鎖的狀態(tài),如果是lock狀態(tài),則繼續(xù)死循環(huán),否則上鎖,結(jié)束死循環(huán)。

(1)任務(wù)不能存在阻塞 (2)任務(wù)耗時短,幾條指令

3)無鎖CAS(Compare and Swap)
比較并交換,是一種原子操作

bool CAS( int * pAddr, int nExpected, int nNew )
atomically {
    if ( *pAddr == nExpected ) {
        *pAddr = nNew ;
        return true ;
    } else
    return false ;
}

2.操作的原子性

#include <stdio.h>

int i = 0;
// gcc -S 1_test_i++.c
int main(int argc, char **argv)
{
    ++i;
    return 0;
}

++i 不是原子操作
匯編代碼

    movl    i(%rip), %eax //把i從內(nèi)存加載到寄存器
    addl    $1, %eax //把寄存器的值加1
    movl    %eax, i(%rip) //把寄存器的值寫回內(nèi)存
static int lxx_atomic_add(int *ptr, int increment)
{
    int old_value = *ptr;
    __asm__ volatile("lock; xadd %0, %1 \n\t"
                     : "=r"(old_value), "=m"(*ptr)
                     : "0"(increment), "m"(*ptr)
                     : "cc", "memory");
    return *ptr;
}

3.原子操作
gcc、g++編譯器提供了一組原子操作api

bool __sync_bool_compare_and_swap (type *ptr, type oldval type newval, ...)

C++11也提供了一組api,定義在<atomic>中

X86架構(gòu)原子操作實現(xiàn)

static int lxx_atomic_add(int *ptr, int increment)
{
    int old_value = *ptr;
    __asm__ volatile("lock; xadd %0, %1 \n\t"
                     : "=r"(old_value), "=m"(*ptr)
                     : "0"(increment), "m"(*ptr)
                     : "cc", "memory");
    return *ptr;
}

4.無鎖隊列的實現(xiàn)
無鎖隊列適用于隊列push、pop非常頻繁的場景,效率要比mutex高很多

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • title: 線程安全問題date: 2019/04/01 17:13 線程安全問題是由于多個線程同時操作同一全局...
    想54256閱讀 994評論 0 0
  • 概覽進(jìn)程同步器件的實現(xiàn)方法關(guān)系圖 原子操作 原子操作:顧名思義就是不可分割的操作,該操作只存在未開始和已完成兩種狀...
    my_little_world閱讀 825評論 0 0
  • Java并發(fā)編程 來自Java并發(fā)編程的藝術(shù)個人博客: http://blog.csdn.net/qq_22329...
    越長越圓閱讀 3,341評論 4 54
  • 為什么要有分布式鎖 隨著架構(gòu)系統(tǒng)的演進(jìn),由純真的單機架構(gòu)到容器化編排的分布式架構(gòu),可以說是一個大型互聯(lián)網(wǎng)企業(yè)發(fā)展的...
    周若谷閱讀 520評論 0 0
  • 我是黑夜里大雨紛飛的人啊 1 “又到一年六月,有人笑有人哭,有人歡樂有人憂愁,有人驚喜有人失落,有的覺得收獲滿滿有...
    陌忘宇閱讀 8,835評論 28 54

友情鏈接更多精彩內(nèi)容