22.線程自解鎖

代碼結構比較複雜的情況下,手動加鎖,解鎖,可能會有所遺漏。

這種情況下,推薦使用自解鎖(自解鎖在構造的時候lock,在析構的時候unlock)(對象在超出作用域時會執行析構)

自解鎖,手動鎖優缺點:自解鎖每次都會構造,析構。在執行效率上沒有手動鎖效率高。

演示代碼:

示例一:手動加鎖,解鎖(要在每個代碼分支的地方保證解鎖)

#include <iostream>
#include <thread>
#include <mutex>

using namespace std;

mutex m_lock;

void workFun(int index)
{

    for (int i = 0; i < 1000; i++)
    {

        m_lock.lock();
        if (i > 500)
        {
            m_lock.unlock();
            return;
        }
        
        cout << index << " child thread " << i << endl;
        m_lock.unlock();

    }

}//搶佔式

int main()
{
    thread t[3];
    for (int n = 0; n<3; n++)
    {
        t[n] = thread(workFun, n);
    }

    for (int n = 0; n<3; n++)
    {
        t[n].join();
    }

    for (int i = 0; i<4; i++)
        cout << "i am main thread " << i << endl;
    return 0;
}

 

 

 

示例二:自解鎖(構造對象時執行了枷鎖,在析構對象時執行了解鎖)

#include <iostream>
#include <thread>
#include <mutex>

using namespace std;

mutex m_lock;

void workFun(int index)
{

    for (int i = 0; i < 1000; i++)
    {
        lock_guard<mutex> gl(m_lock);
        //m_lock.lock();
        if (i > 500)
        {
            //m_lock.unlock();
            return;
        }
        
        cout << index << " child thread " << i << endl;
        //m_lock.unlock();

    }

}//搶佔式

int main()
{
    thread t[3];
    for (int n = 0; n<3; n++)
    {
        t[n] = thread(workFun, n);
    }

    for (int n = 0; n<3; n++)
    {
        t[n].join();
    }

    for (int i = 0; i<4; i++)
        cout << "i am main thread " << i << endl;
    return 0;
}

 

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