【发布时间】:2023-12-24 12:57:01
【问题描述】:
我有一个类处理程序:
class Handler {
private:
std::mutex _mutex_list[4];
std:list<Person*> _waiting_list[4];
std::thread __runner_t;
public:
virtual void start();
};
我正在尝试在新线程中启动处理程序:
Handler* handler = new Handler();
std::thread(&Handler::start, handler);
问题是显然 std::thread 需要类的传输构造函数,我无法将其定义为默认值,因为 std::mutex 无法复制。
我定义了一个自定义复制构造函数,它只复制列表但重新初始化互斥体数组和线程。
这里是:
Handler(const Handler& other) :
_mutex_list(), _waiting_list(other._waiting_list), _runner_t() {};
当然不起作用,因为编译器要求传输构造函数。
我不知道如何实现同样的转移。
这是一个正确的解决方案吗?有没有更好的解决方案?
感谢您的帮助。
【问题讨论】:
-
你能给我们一个minimal reproducible example吗?
Handler* handler = new Handler(); std::thread(&Handler::start, handler);应该可以工作,因为你没有复制对象,只是一个指向它的指针。 -
这并没有解决问题,但包含两个连续下划线 (
__runner_t) 的名称和以下划线后跟大写字母的名称保留供实现使用。不要在你的代码中使用它们。 -
这个问题的答案在这里:*.com/a/29988626/576911
-
感谢所有回复,在尝试做最小、完整和可验证的示例时,它终于解决了。它有一个逻辑错误,我传递的是对象本身而不是指针(在另一个文件中声明和定义)。
标签: c++ multithreading mutex copy-constructor move-semantics