23.線程鎖的使用

不合理的設定臨界區域,會讓線程的調用失去意義。

1.不應該頻繁的使用鎖

2.減小鎖使用的區域,線程公共資源之外 的資源 儘量不要放到臨界區。

-------------------------------------------------------------------------------------------------------

 示例一:(這樣使用線程鎖,設定的臨界區域不合理,會讓線程的調用失去意義,線程並沒有併發執行)

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

using namespace std;

mutex m_lock;

int sum = 0;

void workFun(int index)
{
    m_lock.lock();
    for (int i = 0; i < 1000; i++)
    {
        sum++;
        cout << "thread:"<<index << " sum=" << sum<<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();
    }

    cout << "sum=" << sum << endl;
    cout << "i am main thread " << endl;
    return 0;
}

 

 

----------------------------------------------------------------------------------------------------------

示例二:(不用線程)

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

using namespace std;

mutex m_lock;

int sum = 0;

void workFun()
{
    
    for (int i = 0; i < 300000; i++)
    {
        sum++;
    }
    

}//搶佔式

int main()
{
    thread t[3];

    workFun();

    cout << "sum=" << sum << endl;
    cout << "i am main thread " << endl;
    return 0;
}

 

 

示例三:(使用線程,並且加鎖)

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

using namespace std;

mutex m_lock;

int sum = 0;

void workFun(int index)
{

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

        m_lock.lock();
        sum++;
        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();
    }

    cout << "sum=" << sum << endl;
    cout << "i am main thread " << endl;
    return 0;
}

 

示例三的耗時 會比 示例二的耗時大,所以要慎用多線程,慎用鎖。設計不好的多線程反而會更耗時。

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