使用线程作为成员变量移动类的操作

时间:2016-07-27 17:33:33

标签: c++ multithreading c++11 gcc4.8

我正在努力扩展一些人在这里帮助我Call function inside a lambda passed to a thread所以我的工人类可以支持移动构造函数和移动 <Button.Content> <TextBlock> <Run Text="This" /> <Run Text="is" FontStyle="{Binding Converter={StaticResource ItalicConverter}}" /> <Run Text="a..." /> </TextBlock> </Button.Content> ,但是我遇到了我的类绑定的问题{ {1}}通过复制(或引用)到线程,以便它可以访问类值。哪些是 public class ItalicConverter : IValueConverter { public object Convert(object value, Type targetType, object parameter, CultureInfo culture) { return "Italic"; } public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) { return true; } } operator=this

但是当我尝试移动它,因为线程绑定到另一个条件变量atomic<bool>condition_variable时,我在其上做的任何事情都不起作用。我怎样才能解决这个问题? 我是否需要使用更复杂的对象并将其移动而不是lambda,以便线程可以对它进行引用?还是有另一种选择。 一如既往的帮助将非常感激:)。

这是实现的片段(MWE)。

mutex

对于大量代码转发感到抱歉。

1 个答案:

答案 0 :(得分:2)

我会修理&#39;它只是说worker是不可复制且不可移动的,如果他们想要移动它,则将其留给worker的用户将其存储为unique_ptr。这完全没有错。实际上,它很普通。

如果你绝对希望这个类是可移动的,你可以使用Pimpl设计模式:创建一个Worker::Impl嵌套类worker拥有unique_ptrImpl类是不可复制的,不可移动的,基本上是您当前的worker类。 lambda将有一个指向Impl类的指针,而不是worker类。 worker类只包含unique_ptr Impl以外的任何内容,以及转发到Impl类&#39}的函数。函数,默认的复制和移动ctors /运算符将适用于两个类(工作程序将是可复制的但不可移动,impl将是不可复制的和不可移动的。)