我知道没有STL容器可以保证线程安全。我也知道使用std :: lock_guard实现起来并不是非常困难。然而,对于我目前正在做的事情,我将至少有一个线程将事物推到一个双端队列而另一个线程将它们带走。没有保证的线程数,但我可以保证每个线程都有推或拉,但不是两者都有,如果这完全相关的话。
我一直在做这样的事情:
template<typename T, typename... Args>
class SafeDeque {
std::deque<T, Args...> m_deque;
std::mutex m_mu;
public:
SafeDeque() { }
void push_back(const T& val) {
std::lock_guard<std::mutex> lock(m_mu);
m_deque.push_back(val);
}
void push_front(const T& val) {
std::lock_guard<std::mutex> lock(m_mu);
m_deque.push_front(val);
}
T& back(void) {
std::lock_guard<std::mutex> lock(m_mu);
return m_deque.back();
}
const T& back(void) const {
std::lock_guard<std::mutex> lock(m_mu);
return m_deque.back();
}
T& front(void) {
std::lock_guard<std::mutex> lock(m_mu);
return m_deque.front();
}
const T& front(void) const {
std::lock_guard<std::mutex> lock(m_mu);
return m_deque.front();
}
};
但是,这在某种程度上“感觉”很奇怪。有没有更好的方法只使用标准的C ++ 11/14?我见过这个:
https://github.com/cameron314/concurrentqueue
但如果能帮助我,我宁愿坚持标准。
答案 0 :(得分:3)
你建议的是并发101.你应该看一些其他的库。
答案 1 :(得分:2)