我有一个单独的类来处理线程,并且有一个函数需要创建一个线程并在特定的时间间隔内重复该函数
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
并传递不同的函数
发布于 2019-04-01 01:56:01
您的问题是,您正在通过值捕获lastline
和dict
,然后将它们传递给期望非常量引用的func
。您可能需要像这样捕获:
std::thread([func, interval, filename, &lastline, &dict] {
...
});
然而,当通过引用捕获时,你应该特别小心,以确保这些对象在lambda中使用时仍然是活动的,特别是考虑到你是在一个单独的线程中调用它。这也造成了数据竞争的可能性,因此,如果您要从多个线程访问lastline
和dict
,则需要确保使用适当的同步机制,如std::mutex
。
发布于 2019-04-01 05:12:26
通过值捕获变量会使它们在lambda的主体中隐式const
,这就是为什么将它们作为非成本引用传递给func
时无法编译的原因。
因此,您可以按照r3mus n0x在their answer中的建议执行操作,也可以通过值或作为const ref
将它们传递给func
。我认为我更喜欢r3mus n0x的解决方案,因为它涉及的临时变量较少,前提是在线程执行时引用的变量不会超出范围。
https://stackoverflow.com/questions/55443637
复制相似问题