尝试使用decltype实例化std :: thread时出现编译错误。我知道使用lambdas进行工作循环,但是我发现很难理解我做错了什么。 (也许我使用的是decltype错误)。这些内容在MSVC和GCC 8.1上进行了复制
#include<thread>
template<typename T>
class lockBasedQueue
{
private:
std::queue<T> data_queue;
mutable std::mutex m;
std::condition_variable cond_var;
public:
lockBasedQueue() {}
void push(T newValue)
{
std::lock_guard<std::mutex> lk(m);
data_queue.push(std::move(newValue));
cond_var.notify_one();
}
void wait_and_pop(T& value)
{
std::unique_lock<std::mutex> lk(m);
cond_var.wait(lk, [this]() {return data_queue.size() > 0; });
value = std::move(data_queue.front());
data_queue.pop();
}
bool empty() const
{
return false;
}
};
int main()
{
lockBasedQueue<int> q;
std::thread t1(&lockBasedQueue<int>::push, q, 10);
typedef decltype(q) myQueue;
std::thread t2(&myQueue::empty, q);
t1.join();
t2.join();
return 0;
}
答案 0 :(得分:1)
您的问题是您的课程包含std::mutex
和std::condition_variable
。这使您的班级不可复制且不可移动。那是
std::thread t1(&lockBasedQueue<int>::push, q, 10);
和
std::thread t2(&myQueue::empty, q);
将永远无法工作,因为您无法将q
复制到线程中。
您可以做的是使用&q
获取指向q
的指针,然后线程可以在该指针上调用函数指针。因此,您的代码应该是
int main()
{
lockBasedQueue<int> q;
std::thread t1(&lockBasedQueue<int>::push, &q, 10);
typedef decltype(q) myQueue;
std::thread t2(&myQueue::empty, &q);
t1.join();
t2.join();
return 0;
}