当前位置: 首页 > 知识库问答 >
问题:

C 11 std::带rvalue参数的线程接受函数

卓星波
2023-03-14

我有一些家庭作业,我很难理解(可能)如何将参数传递给std::线程构造函数。

假设以下代码(我删除了不需要的部分)

template<typename T, typename Task>
class Scheduler
{
    private:
        typedef std::unordered_map<std::size_t, T> Results;
        class Solver
        {
            public:
            Solver(Task&& task) : m_thread(&Solver::thread_function, std::move(task))
            {
                m_thread.detach();
            }

            Solver(Solver&& solver) = default; // required for vector::emplace_back
            ~Solver() = default;

            private:
            void thread_function(Task&& task)
            {
                task();
            }
            std::thread m_thread;
        };

    public:
        Scheduler() = default;
        ~Scheduler() = default;

        void add_task(Task&& task)
        {
            m_solvers.emplace_back(std::move(task));
        }

    private:
        std::vector<Solver> m_solvers;
};

template<typename T>
struct Ftor
{
    explicit Ftor(const T& t) : data(t) { }
    T operator()() { std::cout << "Computed" << std::endl; return data; }
    T data;
};

int main()
{
    Scheduler<int, Ftor<int>> scheduler_ftor;
    Scheduler<int, std::function<int(void)>> scheduler_lambda;
    Ftor<int> s(5);
    scheduler_ftor.add_task(std::move(s));
    scheduler_lambda.add_task([](){ std::cout << "Computed" << std::endl; return 1; });
}

为什么不编译?MVS2015在抱怨

函数式(1195):错误C2064:术语不计算为采用1个参数的函数函数式(1195):注意:类没有定义“运算符()”或用户定义的转换运算符到指针到函数或引用到函数,它需要适当数量的参数
注意:在编译类模板成员函数时'Scheduler

而G 4.9.2

功能:在'结构std::实例化_Bind_simple

函数:1665:61:错误:在'类std::中没有名为'type'的类型result_of

我想,将std::移动到std::thread可能存在一些问题。

共有2个答案

司徒正信
2023-03-14

我不懂你的代码,但要解决这个问题,一个外推的答案是(大多数代码都是psuedocode)让我们假设有一个函数int test(int name)

thread t0;
t0 = thread(test,32); 

thread t1(test,43);

将参数传递给函数。

int temp = 0;
int testfunc(int& q)
{
  cout<<q;
}

thread t1;
t1 = thread(testfunc,ref(temp));

简而言之,您只需传递必须在线程中运行的函数的名称作为第一个参数,函数参数按照与函数定义中相同的顺序跟随它,为了通过引用传递,您可以使用包装器。请参见下面的示例。

#include <iostream>
#include <thread>
#include <string>
using namespace std;

void test(int a,int &a,string test)
{
  \\do something
}

int main()
{
     int test1 = 0;
     string tt = "hello";
     thread t1;
     t1 = thread(23,&test1,tt);
     t1.detach();
     return 0;
}

如果你想知道join()detach()的使用,请参考这个线程:我什么时候应该使用std::thread::detach?,参考我在那个线程中的回答帖子。

弓举
2023-03-14

如果您使用成员函数作为第一个线程参数,第二个参数应该是这个指针,指向可以调用成员函数的对象

更新

这里讨论得很好

使用成员函数启动线程

 类似资料:
  • 问题 你希望函数的某些参数强制使用关键字参数传递 解决方案 将强制关键字参数放到某个*参数或者单个*后面就能达到这种效果。比如: def recv(maxsize, *, block): 'Receives a message' pass recv(1024, True) # TypeError recv(1024, block=True) # Ok 利用这种技术,我们还能在接受

  • 问题 你想构造一个可接受任意数量参数的函数。 解决方案 为了能让一个函数接受任意数量的位置参数,可以使用一个*参数。例如: def avg(first, *rest): return (first + sum(rest)) / (1 + len(rest)) # Sample use avg(1, 2) # 1.5 avg(1, 2, 3, 4) # 2.5 在这个例子中,rest是由所

  • 问题内容: 我一直在想是否可以在PHP中将函数作为参数传递;我想要类似的东西,当您在JS中编程时: 我想要的是在exampleMethod中的某处执行该功能。这在PHP中可行吗? 问题答案: 如果您使用的是PHP 5.3.0或更高版本,则是可能的。 请参见手册中的匿名函数。 对于您的情况,您将这样定义:

  • 问题内容: 我想了解为什么下面的代码片段无法编译。将函数接受为可能具有任何返回类型的函数参数的Go方法是什么? 播放:https://play.golang.org/p/CqbuEZGy12 我的解决方案基于Volker的答案: 播放:https://play.golang.org/p/waOGBZZwN7 问题答案: 你绊倒了围棋新人一个非常普遍的误解:空接口并 不能 意味着“任何类型”。确实不

  • 我对编程和C++相当陌生。我有一个函数,我想接受以模板化值作为参数的函数指针。我的意思是... 我有这个功能: 我试过的: 结果: .h:165:22:注意:已忽略候选模板:无法将“function ,allocator >&)”与“void(*)(bool,std::vectorstd::vectorstd::allocatorstd::tuple &)”void postgrescaller:

  • 问题内容: 我想创建一个存储过程,该存储过程接受IN参数中的所有值作为单个字符串。 这是我尝试过的一个示例,但是没有用。 我收到以下错误: 运行此查询时: 问题答案: 您需要将VARCHAR大小更改为最大值(或较低的有效值)。 但是,请注意,如果使用多字节字符集,则限制会更低: