Queue, mutex и threads

Рейтинг: 2Ответов: 1Опубликовано: 07.04.2015

Есть одна ошибка

Error 3 error C2280: 'std::mutex::mutex(const std::mutex &)' : attempting to reference a deleted function

Её надо починить. Как она возникает? Есть один класс, который реализует очередь. В самом конце. Я почитал документацию, что mutex копировать нельзя. Хорошо. Я передаю в функцию ссылку на этот объект. Но к сожалению ловлю эту ошибку.


Функция main()

int main()
{
   Queue<MyStruct> tasks; //создаем объект
   std::thread t1(buildQueue, tasks); //кидаем ссылку 
   return 0;
}
void buildQueue(Queue<MyStruct> &taskQueue)
{
 ; //ничего не делает. 
}

Класс Queue

template <typename T> class Queue{

private:
    const unsigned int MAX = 5;
    std::deque<T>           newQueue;
    std::mutex              d_mutex;
    std::condition_variable d_condition;

public:
    void push(T const& value)
    {

        {
            std::unique_lock<std::mutex> lock(this->d_mutex);
            newQueue.push_front(value);
        }
        this->d_condition.notify_one();
    }
    T pop()
    {
        std::unique_lock<std::mutex> lock(this->d_mutex);
        this->d_condition.wait(lock, [=]{ return !this->newQueue.empty(); });
        T rc(std::move(this->newQueue.back()));
        this->newQueue.pop_back();
        return rc;
    }   
};

Где-то читал, что такая проблема возникает в том, что вызывает конструктор, который пытается копировать mutex. Хотя я, вроде бы, ничего не копирую.

Ответы

▲ 2
std::thread t1(buildQueue, std::ref(tasks)); 
t1.join();