Как исправить «использование удаленной функции» при использовании мьютекса и условной переменной в качестве члена? - PullRequest
0 голосов
/ 15 октября 2019

Я выполняю несколько многопоточных упражнений и не могу получить компиляцию кода. Я ищу в Интернете, но пока не совсем уверен в причине.

#include <condition_variable>
#include <functional>
#include <iostream>
#include <mutex>
#include <thread>

using namespace std;

class FooBar {
  private:
    int n;

  public:
    FooBar(int n) {
        this->n = n;
    }

    void foo(function<void()> printFoo) {
        for (int i = 0; i < n; i++) {
            printFoo();
        }
    }

    std::mutex foo_mtx;
    std::condition_variable foo_cv;
};

void printFoo()
{
    cout << "foo";
}

int main ()
{
    FooBar foobar(10);
    std::thread foo_thread = std::thread(&FooBar::foo, foobar, printFoo);
    foo_thread.join();
    return 0;
}

Этот код компилируется и хорошо работает, если я не добавлю мьютекс и переменную условия.

error: use of deleted function ‘FooBar::FooBar(const FooBar&)’
error: use of deleted function ‘std::mutex::mutex(const std::mutex&)’
error: use of deleted function ‘std::condition_variable::condition_variable(const std::condition_variable&)’

1 Ответ

2 голосов
/ 15 октября 2019

Вы копируете fooBar. Компилятор говорит, что вы не можете. Вы не можете этого сделать, потому что мьютекс не может быть скопирован.

std::thread foo_thread = std::thread(&FooBar::foo, std::ref(foobar), printFoo);

, и эта конкретная ошибка компилятора исчезнет. Без его построения я не могу быть уверен, что других проблем нет.

std::thread foo_thread = std::thread([&foobar]{ foobar.foo(printFoo); });

Это более разумный способ решения той же проблемы. Лямбды обычно лучше, чем использовать интерфейсы на основе INVOKE.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...