使用互斥量和条件变量作为成员时如何解决“已删除功能的使用?”

问题描述 投票:0回答:1

我正在做一些多线程练习,无法通过编译获得此代码。我在网上搜索,但到目前为止仍不确定原因。

#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&)’
c++ mutex condition-variable
1个回答
0
投票

您正在复制fooBar。编译器说您不允许这样做。不允许这样做,因为无法复制互斥锁。

std::thread foo_thread = std::thread(&FooBar::foo, std::ref(foobar), printFoo);
© www.soinside.com 2019 - 2024. All rights reserved.