鎖、原子變量

當多個線程操作同一全局變量時,需要對該變量進行保護。推薦使用原子變量,當然也可以使用加鎖。

原子變量,參考官方cplusplus.com/reference/atomic/atomic/,翻譯C++原子變量atomic詳解 - 知乎 (zhihu.com)

鎖,推薦使用 std::lock_guard或std::unique_lock,實現了互斥元的RAII慣用語法(資源獲取即初始化)。該對象在構造時鎖定所給的互斥元,析構時解鎖該互斥元,從而保證被鎖定的互斥元始終被正確解鎖。

unique_lock是對lock_guard的擴展,允許在生命週期內再調用lock和unlock來加解鎖以切換鎖的狀態。

#include<iostream>
#include<thread>
#include<atomic>

//int g_share = 0;
std::atomic<int> g_share(0);    //原子變量

//#include<mutex>
//std::mutex g_mutex;

void thread1()
{
    //std::lock_guard<std::mutex> lck(g_mutex);    //非原子變量,則需加鎖
    while (g_share<20)
    {
        g_share++;
        std::cout << "thread1 " << g_share << std::endl;
    }
}
void thread2()
{
    //std::lock_guard<std::mutex> lck(g_mutex);
    while (g_share<20)
    {
        g_share++;
        std::cout << "thread2 " << g_share << std::endl;
    }
}

int main()
{
    std::thread task1(thread1);
    std::thread task2(thread2);
    task1.join();
    task2.join();
    std::cout << "main thread end!" << std::endl;

    return 0;
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章