jeudi 16 juillet 2020

why the program using atomic CAS cannot keep thread safety?


int main(){

    atomic<bool> atomic_lock(false);
    std::atomic_flag lock_flag = ATOMIC_FLAG_INIT;
    int count = 0;


    auto f = [&](){
        bool flag = false;
        
        for( int i = 0; i< 10000000; ++i){
          while(!atomic_lock.compare_exchange_strong(flag, true)){}
          //while(lock_flag.test_and_set(std::memory_order_seq_cst));

          ++count;
          //lock_flag.clear(std::memory_order_seq_cst);
          atomic_lock.store(false, std::memory_order_seq_cst);
        }
    };

    thread t1(f);
    thread t2(f);
    t1.join();
    t2.join();

    cout<<count<<endl;

    return 0;
}

here is my program, I want to replace mutex with CAS, but output which is not 20000000 shows it is not a thread safety program, where is wrong? However, I replace atomic with atomic_flag show as above, output is right

Aucun commentaire:

Enregistrer un commentaire