在线不卡日本ⅴ一区v二区_精品一区二区中文字幕_天堂v在线视频_亚洲五月天婷婷中文网站

  • <menu id="lky3g"></menu>
  • <style id="lky3g"></style>
    <pre id="lky3g"><tt id="lky3g"></tt></pre>

    C++關(guān)鍵字整理

    atomic

    #include

    原子操作(atomic): 互斥量的加鎖一般是針對一個代碼段,而原子操作針對的一般都是一個變量。原子變量既不可復(fù)制亦不可移動。(1)它表示在多個線程訪問同一個全局資源的時候,能夠確保所有其他的線程都不在同一時間內(nèi)訪問相同的資源。也就是他確保了在同一時刻只有唯一的線程對這個資源進行訪問。這有點類似互斥對象對共享資源的訪問的保護,但是原子操作更加接近底層,因而效率更高。是線程安全的。

    (2)原子數(shù)據(jù)類型不會發(fā)生數(shù)據(jù)競爭,能直接用在多線程中而不必我們用戶對其進行添加互斥資源鎖的類型。從實現(xiàn)上,大家可以理解為這些原子類型內(nèi)部自己加了鎖。

    (3)C++11中所有的原子類都是不允許拷貝、不允許Move的,atomic_flag也不例外。

    (4)C++11 對常見的原子操作進行了抽象,定義出統(tǒng)一的接口,并根據(jù)編譯選項/環(huán)境產(chǎn)生平臺相關(guān)的實現(xiàn)。新標(biāo)準(zhǔn)將原子操作定義為atomic模板類的成員函數(shù),囊括了絕大多數(shù)典型的操作——讀、寫、比較、交換等

    contained type

    atomic type

    bool

    atomic_bool

    char

    atomic_char

    signed char

    atomic_schar

    unsigned char

    atomic_uchar

    short

    atomic_short

    unsigned short

    atomic_ushort

    int

    atomic_int

    unsigned int

    atomic_uint

    long

    atomic_long

    unsigned long

    atomic_ulong

    long long

    atomic_llong

    unsigned long long

    atomic_ullong

    wchar_t

    atomic_wchar_t

    char16_t

    atomic_char16_t

    char32_t

    atomic_char32_t

    intmax_t

    atomic_intmax_t

    uintmax_t

    atomic_uintmax_t

    int_leastN_t

    atomic_int_leastN_t

    uint_leastN_t

    atomic_uint_leastN_t

    int_fastN_t

    atomic_int_fastN_t

    uint_fastN_t

    atomic_uint_fastN_t

    intptr_t

    atomic_intptr_t

    uintptr_t

    atomic_uintptr_t

    size_t

    atomic_size_t

    ptrdiff_t

    atomic_ptrdiff_t

    (4)macro

    macro

    relative to types

    ATOMIC_BOOL_LOCK_FREE

    bool

    ATOMIC_CHAR_LOCK_FREE

    char

    signed char

    unsigned char

    ATOMIC_SHORT_LOCK_FREE

    short

    unsigned short

    ATOMIC_INT_LOCK_FREE

    int

    unsigned int

    ATOMIC_LONG_LOCK_FREE

    long

    unsigned long

    ATOMIC_LLONG_LOCK_FREE

    long long

    unsigned long long

    ATOMIC_WCHAR_T_LOCK_FREE

    wchar_t

    ATOMIC_CHAR16_T_LOCK_FREE

    char16_t

    ATOMIC_CHAR32_T_LOCK_FREE

    char32_t

    ATOMIC_POINTER_LOCK_FREE

    U*

    (for any type U)

    (5)memory_order:內(nèi)存順序

    序號

    意義

    1

    memory_order_relaxed

    寬松模型,不對執(zhí)行順序做保證

    2

    memory_order_consume

    當(dāng)前線程中,滿足happens-before原則。

    當(dāng)前線程中該原子的所有后續(xù)操作,必須在本條操作完成之后執(zhí)行

    3

    memory_order_acquire

    當(dāng)前線程中,讀操作滿足happens-before原則。

    所有后續(xù)的讀操作必須在本操作完成后執(zhí)行

    4

    memory_order_release

    當(dāng)前線程中,寫操作滿足happens-before原則。

    所有后續(xù)的寫操作必須在本操作完成后執(zhí)行

    5

    memory_order_acq_rel

    當(dāng)前線程中,同時滿足memory_order_acquire和memory_order_release

    6

    memory_order_seq_cst

    最強約束。全部讀寫都按順序執(zhí)行

    (6)Functions

    (7)std::atomic的限制:trivially copyable(可平凡復(fù)制):一個類型如果是trivially copyable,則使用memcpy這種方式把它的數(shù)據(jù)從一個地方拷貝出來會得到相同的結(jié)果。

    1.沒有non-trivial 的拷貝構(gòu)造函數(shù)

    2.沒有non-trivial的move構(gòu)造函數(shù)

    3.沒有non-trivial的賦值操作符

    4.沒有non-trivial的move賦值操作符

    5.有一個trivial的析構(gòu)函數(shù)

    std::atomic_flag:最簡單的原子變量實例,是對于bool類型的變量進行原子操作,提供了標(biāo)志的管理,標(biāo)志有三種狀態(tài):clear、set和未初始化狀態(tài)。

    接口介紹:

    (1)ATOMIC_FLAG_INIT:用于給atomic_flag變量賦初值,如果定義后為賦值,則狀態(tài)是不確定的。被這個賦值后的狀態(tài)為false。

    (2)test_and_set() :接口函數(shù),調(diào)用后狀態(tài)變?yōu)閠rue,并返回改變狀態(tài)前的狀態(tài)值。

    (3)clear() : 接口函數(shù),調(diào)用后狀態(tài)變?yōu)閒alse。

    #include

    #include

    #include

    #include

    std::atomic_flag lock = ATOMIC_FLAG_INIT;

    int gcnt = 0;

    void f(int n)

    {

    for (int cnt = 0; cnt < 100; ++cnt) {

    while (lock.test_and_set(std::memory_order_acquire)) // 獲得鎖

    ; // 自旋

    std::cout << "Output from thread " << n << '';

    gcnt++;

    lock.clear(std::memory_order_release); // 釋放鎖

    }

    }

    int main()

    {

    std::vector v;

    for (int n = 0; n < 10; ++n) {

    v.emplace_back(f, n);

    }

    for (auto& t : v) {

    t.join();

    }

    }

    自旋鎖的解釋:當(dāng)某一個線程調(diào)用‘lock.test_and_set’時,即設(shè)置lock的狀態(tài)為true,當(dāng)另一個線程進入時,再次調(diào)用test_and_set時返回的狀態(tài)為true,則一直在while循環(huán)中不斷獲取,即實現(xiàn)了等待,直到第一個線程調(diào)用clear將狀態(tài)變?yōu)閒alse。

    std::atomic:通過atomic模板類可以對更多的類型進行原子操作

    (1)is_lock_free:通過這個接口判斷是否需要加鎖。如果是,則在多個線程訪問該對象時不會導(dǎo)致線程阻塞(可能使用某種事務(wù)內(nèi)存transactional memory方法實現(xiàn)lock-free的特性)。事實上該函數(shù)可以做為一個靜態(tài)函數(shù)。所有指定相同類型T的atomic實例的is_lock_free函數(shù)都會返回相同值。

    (2)store:賦值操作。operator=實際上內(nèi)部調(diào)用了store,并返回d。

    void store(T desr, memory_order m = memory_order_seq_cst) noexcept;void store(T desr, memory_order m = memory_order_seq_cst) volatile noexcept;T operator=(T d) noexcept;T operator=(T d) volatile noexcept;

    (3)load: 讀取,加載并返回變量的值。operator T是load的簡化版,內(nèi)部調(diào)用的是load(memory_order_seq_cst)形式。

    (4)exchange:交換,賦值后返回變量賦值前的值。exchange也稱為read-modify-write操作。

    T exchange(T desr, memory_order m = memory_order_seq_cst) volatile noexcept;

    T exchange(T desr, memory_order m = memory_order_seq_cst) noexcept;

    (5)compare_exchange_weak:這就是有名的CAS(Compare And Swap: 比較并交換)。操作是原子的,排它的。其它線程如果想要讀取或修改該原子對象時,會等待先該操作完成。

    (6)compare_exchange_strong:

    進行compare時,與weak版一樣,都是比較的物理內(nèi)容。與weak版不同的是,strong版本不會返回偽false。即:原子對象所封裝的值如果與expect在物理內(nèi)容上相同,strong版本一定會返回true。其所付出的代價是:在某些需要循環(huán)檢測的算法,或某些平臺下,其性能較compare_exchange_weak要差。但對于某些不需要采用循環(huán)檢測的算法而言, 通常采用compare_exchange_strong 更好。

    std::atomic特化

    (1)fetch_add:該函數(shù)將原子對象封裝的值加上v,同時返回原子對象的舊值。其功能用偽代碼表示為:

    // T is integral

    T fetch_add(T v, memory_order m = memory_order_seq_cst) volatile noexcept;

    T fetch_add(T v, memory_order m = memory_order_seq_cst) noexcept;

    // T is pointer

    T fetch_add(ptrdiff_t v, memory_order m = memory_order_seq_cst) volatile noexcept;

    T fetch_add(ptrdiff_t v, memory_order m = memory_order_seq_cst) noexcept;

    (2)fetch_sub:該函數(shù)將原子對象封裝的值減去v,同時返回原子對象的舊值。其功能用偽代碼表示為:

    // T is integral

    T fetch_sub(T v, memory_order m = memory_order_seq_cst) volatile noexcept;

    T fetch_sub(T v, memory_order m = memory_order_seq_cst) noexcept;

    // T is pointer

    T fetch_sub(ptrdiff_t v, memory_order m = memory_order_seq_cst) volatile noexcept;

    T fetch_sub(ptrdiff_t v, memory_order m = memory_order_seq_cst) noexcept;

    (3)++, –, +=, -=:不管是基于整數(shù)的特化,還是指針特化,atomic均支持這四種操作。其用法與未封裝時一樣

    獨屬于數(shù)值型特化的原子操作 – 位操作:

    (1)fetch_and,fetch_or,fetch_xor:

    位操作,將contained按指定方式進行位操作,并返回contained的舊值。

    integral fetch_and(integral v, memory_order m = memory_order_seq_cst) volatile noexcept;

    integral fetch_and(integral v, memory_order m = memory_order_seq_cst) noexcept;

    integral fetch_or(integral v, memory_order m = memory_order_seq_cst) volatile noexcept;

    integral fetch_or(integral v, memory_order m = memory_order_seq_cst) noexcept;

    integral fetch_xor(integral v, memory_order m = memory_order_seq_cst) volatile noexcept;

    integral fetch_xor(integral v, memory_order m = memory_order_seq_cst) noexcept;

    (2)perator &=,operator |=,operator ^=:與相應(yīng)的fetch_*操作不同的是,operator操作返回的是新值

    T operator &=(T v) volatile noexcept {return fetch_and(v) & v;}

    T operator &=(T v) noexcept {return fetch_and(v) & v;}

    T operator |=(T v) volatile noexcept {return fetch_or(v) | v;}

    T operator |=(T v) noexcept {return fetch_or(v) | v;}

    T operator ^=(T v) volatile noexcept {return fetch_xor(v) ^ v;}

    T operator ^=(T v) noexcept {return fetch_xor(v) ^ v;}

    鄭重聲明:本文內(nèi)容及圖片均整理自互聯(lián)網(wǎng),不代表本站立場,版權(quán)歸原作者所有,如有侵權(quán)請聯(lián)系管理員(admin#wlmqw.com)刪除。
    上一篇 2022年6月30日 20:05
    下一篇 2022年6月30日 20:05

    相關(guān)推薦

    聯(lián)系我們

    聯(lián)系郵箱:admin#wlmqw.com
    工作時間:周一至周五,10:30-18:30,節(jié)假日休息