使用互斥锁和条件变量作为成员时如何修复"use of deleted function"?
How to fix "use of deleted function" when using mutex and condition variable as member?
我正在做一些多线程练习,无法获得此代码传递编译。我在网上搜索,但到目前为止还不确定原因。
#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&)’
您正在复制fooBar
。 编译器说你不被允许。 不允许这样做,因为无法复制互斥锁。
std::thread foo_thread = std::thread(&FooBar::foo, std::ref(foobar), printFoo);
这将使特定的编译器错误消失。 如果不构建它,我无法确定没有其他问题。
std::thread foo_thread = std::thread([&foobar]{ foobar.foo(printFoo); });
这是解决相同问题的更理智的方法。 Lambda 通常是比使用基于 INVOKE 的接口更好的计划。
相关文章:
- 静态数据成员的问题-修复链接错误会导致编译器错误
- Boost Graph Library,修复节点大小
- 函数何时会在c++中包含stack_Unwind_Resume调用
- 如何修复此错误:未定义对"距离(浮点数,浮点数,浮点数,浮点数,浮点数)"的引用
- 如何修复函数样式强制转换或类型构造的预期"("?
- 如何针对特定情况调试和修复此双自由内存损坏问题
- 当使用带有VS2019或VSCode的虚幻引擎4.24.2时,我如何修复这些错误的Intellisense错误
- 如何修复sfml c++代码编译错误
- Python中的for循环与C++有何不同
- 如何修复此iFile以将.txt输出到控制台
- 我收到同义重复编译器错误。我应该如何修复"类型"X"的参数与类型"X"的参数不兼容?
- 如何修复链表类实现的未处理异常0xDDDDDDDD
- 如何处理 c++ 中类实现中的"invalid use of non-static data member"?
- 如何修复此错误:className::className的无效使用
- 叮叮当当在修复时插入多个"覆盖"说明符
- 如何修复带有 clang 的参数'args'缺少默认参数的问题?
- 如何修复 Onnx运行时会话>运行问题?
- 使用互斥锁和条件变量作为成员时如何修复"use of deleted function"?
- 如何修复库中的"invalid use of non-static member function" 导入另一个库
- "Invalid use of void expression",我该如何修复?C++