明明互斥鎖能解決的問題,幹嘛還要用條件變量呢?
當然是爲了提高效率啊!!!
互斥法輪詢
#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:感謝大神