明明互斥锁能解决的问题,干嘛还要用条件变量呢?
当然是为了提高效率啊!!!
互斥法轮询
#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:感谢大神