首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >c++使用自定义对象作为线程中的参数传递std::函数

c++使用自定义对象作为线程中的参数传递std::函数
EN

Stack Overflow用户
提问于 2019-04-01 01:38:26
回答 2查看 547关注 0票数 2

我有一个单独的类来处理线程,并且有一个函数需要创建一个线程并在特定的时间间隔内重复该函数

void timer_start_custom(std::function<void(string, string&, vector<CustomObject>&)> func, string filename, string& lastline, vector<CustomObject>& dict, unsigned int interval){
     std::thread([func, interval, filename, lastline, dict](){
         while (true){
             auto x = std::chrono::steady_clock::now() + std::chrono::milliseconds(interval);
             func(filename, lastline, dict);
             std::this_thread::sleep_until(x);
         }
     }).detach();
}

然而,现在的编译器compain:

No matching function for call to object of type 'const
std::function<void (string, string &, vector<RowData> &)>' (aka
'const function<void (basic_string<char, char_traits<char>, allocator<char> >,
basic_string<char, char_traits<char>, allocator<char> > &, vector<RowData> &)>')

我知道如果一个函数放在同一个文件中,那么我可以跳过函数作为参数,但我仍然非常好奇和顽固地想知道如何解决这个问题,因为我会在不同的文件中调用timer_start_custom并传递不同的函数

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-04-01 01:56:01

您的问题是,您正在通过值捕获lastlinedict,然后将它们传递给期望非常量引用的func。您可能需要像这样捕获:

std::thread([func, interval, filename, &lastline, &dict] {
...
});

然而,当通过引用捕获时,你应该特别小心,以确保这些对象在lambda中使用时仍然是活动的,特别是考虑到你是在一个单独的线程中调用它。这也造成了数据竞争的可能性,因此,如果您要从多个线程访问lastlinedict,则需要确保使用适当的同步机制,如std::mutex

票数 2
EN

Stack Overflow用户

发布于 2019-04-01 05:12:26

通过值捕获变量会使它们在lambda的主体中隐式const,这就是为什么将它们作为非成本引用传递给func时无法编译的原因。

因此,您可以按照r3mus n0x在their answer中的建议执行操作,也可以通过值或作为const ref将它们传递给func。我认为我更喜欢r3mus n0x的解决方案,因为它涉及的临时变量较少,前提是在线程执行时引用的变量不会超出范围。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55443637

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档