使用互斥锁和条件变量作为成员时如何修复“使用已删除函数”?

use*_*574 4 c++ mutex condition-variable

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

\n\n
#include <condition_variable>\n#include <functional>\n#include <iostream>\n#include <mutex>\n#include <thread>\n\nusing namespace std;\n\nclass FooBar {\n  private:\n    int n;\n\n  public:\n    FooBar(int n) {\n        this->n = n;\n    }\n\n    void foo(function<void()> printFoo) {\n        for (int i = 0; i < n; i++) {\n            printFoo();\n        }\n    }\n\n    std::mutex foo_mtx;\n    std::condition_variable foo_cv;\n};\n\nvoid printFoo()\n{\n    cout << "foo";\n}\n\nint main ()\n{\n    FooBar foobar(10);\n    std::thread foo_thread = std::thread(&FooBar::foo, foobar, printFoo);\n    foo_thread.join();\n    return 0;\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

如果我不添加互斥体和条件变量,此代码可以编译并运行良好。

\n\n
error: use of deleted function \xe2\x80\x98FooBar::FooBar(const FooBar&)\xe2\x80\x99\nerror: use of deleted function \xe2\x80\x98std::mutex::mutex(const std::mutex&)\xe2\x80\x99\nerror: use of deleted function \xe2\x80\x98std::condition_variable::condition_variable(const std::condition_variable&)\xe2\x80\x99\n
Run Code Online (Sandbox Code Playgroud)\n

Yak*_*ont 5

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

std::thread foo_thread = std::thread(&FooBar::foo, std::ref(foobar), printFoo);
Run Code Online (Sandbox Code Playgroud)

这将使特定的编译器错误消失。如果不构建它,我无法确定是否存在其他问题。

std::thread foo_thread = std::thread([&foobar]{ foobar.foo(printFoo); });
Run Code Online (Sandbox Code Playgroud)

这是解决同一问题的更明智的方法。Lambda 通常是比使用基于 INVOKE 的接口更好的计划。