21.多線程-鎖與臨界區域

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

代碼一:

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

using namespace std;

mutex m_lock;

void workFun(int index)
{

    for (int i = 0; i < 100; i++)
    {
        m_lock.lock();
        //臨界區域-開始
        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)
{
    m_lock.lock();
    //臨界區域-開始
    for (int i = 0; i < 100; i++)
    {
        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;
}

 

代碼二,會讓 t[0] t[1]  t[2] 這三個線程不再並行,而是順序執行。這樣就失去了調用線程的意義。

 

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