【问题标题】:Create a thread over a templated member function在模板化成员函数上创建线程
【发布时间】:2021-03-06 00:29:21
【问题描述】:

我有这个模板化的成员“函数”,它的参数是一个对象实例和这个对象的一个​​成员函数(就像一个包装器):

class Monitor
{
    Monitor();
    ~Monitor();
    
    template <typename O, typename F>
    void (O object, F function)
    {
        object.function();
    }
}

如果我们有这个类:

class Object
{
     Object();
     ~Object();

     function()
     {
          std::cout << "Do something" << std::endl;
     };
}

对这个函数的调用会是这样的:

int main()
{
    Monitor monitor;
    Object object;
    
    monitor.waitData(object, function);

    return 0;
};

这就是问题所在。如果我想调用一个在成员函数“waitData”上工作的线程,应该怎么写?

int main()
{
    Monitor monitor;
    Object object;
    
    // std::thread threadWait(monitor.waitData(object, function)) -> Obviously gets an error
    std::thread threadWait(???????);

    return 0;
};

提前致谢。

【问题讨论】:

  • plz,如果任何答案都很好地回答了您的问题,请考虑支持并接受它。如果不是请说明原因。

标签: c++ multithreading templates monitor


【解决方案1】:

您可以将其包装在 lambda 中:

std::thread threadWait([&]{
    monitor.waitData(object, function);
});

当然,需要考虑对象的生命周期——在这个例子中,所有 3 个对象都是通过引用捕获的,这意味着它们需要在线程运行时保留。

【讨论】:

    【解决方案2】:

    您可以按照上一个答案的建议将其包装在 lambda 中,也可以使用以下方法。

    请注意,您可以使用值语义而不是引用语义,因为任何类中都没有字段。但我会用你的方式。

    #include <iostream>
    #include <thread>
    
    struct Monitor{
        template <typename O, typename F>
        void waitData(O& object, F function){
            object.function();
        }
    };
    
    struct Object{
        void function(){
            std::cout << "Do something" << std::endl;
        };
    };
    
    int main()
    {
        Monitor monitor;
        Object object;
        auto t = std::jthread{
                &Monitor::waitData<Object, void(Object::*)(void)/*decltype(&Object::function)*/>,
                std::ref(monitor), std::ref(object), &Object::function
        };
    };
    

    【讨论】:

    • 为什么这只适用于“std::ref(object)”而不是“&object”?
    • @vicalomen 因为std;;thread 取值而不是引用,std::ref() 产生一个reference wrapper 然后它在使用它时由值bu 取值,它给出了真正的引用。
    猜你喜欢
    • 2012-11-09
    • 2017-11-28
    • 1970-01-01
    • 1970-01-01
    • 2012-05-17
    • 1970-01-01
    • 1970-01-01
    • 2012-04-03
    • 1970-01-01
    相关资源
    最近更新 更多