簡體   English   中英

對std :: atomic使用比較和讀/寫操作 <bool> 在C ++中?

[英]Using compare and read/write operations for std::atomic<bool> in c++?

假設有2線程作為threadAthreadB ,我們將在這些threads使用std::atomic<bool>數據類型。 因此,下面是一些關鍵部分:

我的全局變量(並發線程訪問):

std::atomic<bool> flag;

線程A:

void *threadA(void *arg)
{
    bool ttt = true;
    if(flag == true)                   // comparison operator ==
        // do something

    // something to do
    flag = false;                      // assign a avalue
    ttt = flag;                        // read operation

    return 0;
}

線程B:

void *threadB(void *arg)
{
    bool m = true;
    if(flag == true)                   // comparison operator ==
        flag = false;

    // something to do
    flag = true;                       // assign a value
    m = !flag;                         // read operation

    return 0;
}

無論如何,我知道std::atomic<>與普通數據類型不同,它們是自由競爭者,但是我想確定這些:

  • 使用==assignmentread/write而不是(例如) std::atomic_load或exchange語句時會遇到什么麻煩?
  • 是否可能在讀取或寫入flag時發生任何麻煩,例如memory問題?
  • 在具有任何CPU架構的任何平台上,它絕對安全嗎? 我的意思是(可移植的代碼)。 因為在某些X86體系結構中不需要atomic<bool>

我只是想使用atomic特性而不是mutex

使用==assignmentread/write而不是(例如) std::atomic_loadexchange語句時會遇到什么麻煩?

當將operator==std::atomic<T>T ,它將首先使用最強的內存排序std::memory_order_seq_cst調用atomic<T>::operator T()load原子值。 接下來,使用operator==(T, T) 此序列不是原子的。 這意味着,當實際進行比較時, std::atomic<T>可能已經更改。

只是想使用原子特性而不是mutex

您可以使用std :: atomic :: compare_exchange_weak使用原子實現自旋鎖(有一個示例),但是它無法像std::mutex那樣使線程進入睡眠狀態。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM