Osg::Mutex 与 C++1X的std::mutex
1.osg为什么要自定义osg::mutex/osg::Condition,而不是使用标准库中的std::mutex/std::condition_variable?
C++11标准的发布晚于 osg的发布。
2.osg::mutex+osg::Condition 与 std::mutex+std::condition_variable是否等价?
可以认为是一样的。
Osg::Condition::signal() = std::condition_variable::notify_one()
Osg::Condition::broadcast() = std::condition_variable::notify_all()
#include "stdafx.h"
#include <vector>
#include <thread>
#include <iostream>
#include <mutex>
#include <string>
#include <list>
//线程容器
using alThreadContainer = std::vector<std::thread>;
alThreadContainer m_alThreadContainer;
//线程同步
std::mutex m_alMutex;
std::condition_variable m_alConditionFull;
//公共资源
constexpr int g_MaxSize{ 10000 };
std::list<std::string> m_Queue;
//线程函数:生产者、消费者
void Producter()
{
int i = 0;
while (i<1000000)
{
std::unique_lock<std::mutex> Locker(m_alMutex);
m_alConditionFull.wait(Locker, [&]() {return m_Queue.size()<g_MaxSize;});
std::cout << "生产商品 " + std::to_string(m_Queue.size() + 1) + "\n";
m_Queue.push_back("商品 "+std::to_string(m_Queue.size()+1)+" \n");
Locker.unlock();
m_alConditionFull.notify_all();
++i;
}
}
void Customer()
{
int i = 0;
while (i<1000000)
{
std::unique_lock<std::mutex> Locker(m_alMutex);
m_alConditionFull.wait(Locker, [&]() {return !m_Queue.empty();});
std::cout << "消费 " << m_Queue.front() << std::endl;
m_Queue.pop_front();
Locker.unlock();
++i;
}
}
int main()
{
std::thread t1(Customer);
std::thread t2(Customer);
std::thread t3(Producter);
m_alThreadContainer.emplace_back(std::move(t1));
m_alThreadContainer.emplace_back(std::move(t2));
m_alThreadContainer.emplace_back(std::move(t3));
for (auto & aThead : m_alThreadContainer)
{
if (aThead.joinable()) {aThead.join();}
}
return 0;
}