decltype和模板问题

时间:2018-07-26 14:57:12

标签: c++ multithreading templates decltype

尝试使用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;
}

1 个答案:

答案 0 :(得分:1)

您的问题是您的课程包含std::mutexstd::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;
}