互斥鎖和條件變量

明明互斥鎖能解決的問題,幹嘛還要用條件變量呢?

當然是爲了提高效率啊!!!

互斥法輪詢

#include <mutex>
#include <iostream>
#include <queue>

using namespace std;

queue<int> msgs;
mutex m;
condition_variable cond;
long long loops = 0;

void writerfunc()
{
    for (int i = 0; i < 5; i++)
    {
        this_thread::sleep_for(chrono::seconds(1));
        lock_guard<mutex> lck(m);
        cout << "Write Message: " << i << endl;
        msgs.push(i);
    }
}


void readerfunc()
{
    while (true)
    {
        loops++;
        lock_guard<mutex> lck(m);
        if (!msgs.empty())
        {
            int s = msgs.front();
            cout << "Read Message: " << s << endl;
            msgs.pop();
            if (s == 4)
                break;
        }
    }
}


int main()
{
    thread reader(readerfunc);
    thread writer(writerfunc);
    writer.join();
    reader.join();
    cout << "輪詢次數:" << loops << endl;
    return 0;
}

輸出:
Write Message: 0
Read Message: 0
Write Message: 1
Read Message: 1
Write Message: 2
Read Message: 2
Write Message: 3
Read Message: 3
Write Message: 4
Read Message: 4
輪詢次數:9249336

條件變量輪詢

#include <mutex>
#include <iostream>
#include <queue>

using namespace std;

queue<int> msgs;
mutex m;
condition_variable cond;
long long loops = 0;

void writerfunc()
{
    for (int i = 0; i < 5; i++)
    {
        this_thread::sleep_for(chrono::seconds(1));
        unique_lock<mutex> lck(m);
        cout << "Write Message: " << i << endl;
        msgs.push(i);
        cond.notify_one();
    }
}

void readerfunc()
{
    while (true)
    {
        loops++;
        unique_lock<mutex> lck(m);
        cond.wait(lck);
        if (!msgs.empty())
        {
            int s = msgs.front();
            cout << "Read Message: " << s << endl;
            msgs.pop();
            if (s == 4)
                break;
        }
    }
}

int main()
{
    thread reader(readerfunc);
    thread writer(writerfunc);
    writer.join();
    reader.join();
    cout << "輪詢次數:" << loops << endl;
    return 0;
}


輸出:
Write Message: 0
Read Message: 0
Write Message: 1
Read Message: 1
Write Message: 2
Read Message: 2
Write Message: 3
Read Message: 3
Write Message: 4
Read Message: 4
輪詢次數:5

對比輪詢次數,用屁股想也知道哪種效率高了,

PS:感謝大神

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