试图将向量的内容传递给线程
Trying to pass contents of a vector to a thread
我有一个函数,它接受一个字符串向量,并且在一个向量中有一系列这些字符串向量。
我想循环遍历vector,将每个string类型的vector传递给一个新线程。
for (vector<vector<string> >::iterator it = vecstringvec.begin() ;
it != vecstringvec.end(); ++it){
threadvector.push_back(thread(func, *it));
}
基本上是上面的,除了上面的不起作用(编译错误)。我认为我需要一个vector的std::ref来传递,但我不确定确切的方法,或者如何使用迭代器来实现。
完全错误:
/usr/include/c++/4.8/functional: In instantiation of ‘struct std::_Bind_simple<void (*(std::vector<std::basic_string<char> >, std::reference_wrapper<std::vector<std::basic_string<char> > >))(std::vector<std::basic_string<char> >&, std::vector<std::basic_string<char> >&)>’:
/usr/include/c++/4.8/thread:137:47: required from ‘std::thread::thread(_Callable&&, _Args&& ...) [with _Callable = void (&)(std::vector<std::basic_string<char> >&, std::vector<std::basic_string<char> >&); _Args = {std::vector<std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::allocator<std::basic_string<char, std::char_traits<char>, std::allocator<char> > > >&, std::reference_wrapper<std::vector<std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::allocator<std::basic_string<char, std::char_traits<char>, std::allocator<char> > > > >}]’
prog.cpp:199:55: required from here
/usr/include/c++/4.8/functional:1697:61: error: no type named ‘type’ in ‘class std::result_of<void (*(std::vector<std::basic_string<char> >, std::reference_wrapper<std::vector<std::basic_string<char> > >))(std::vector<std::basic_string<char> >&, std::vector<std::basic_string<char> >&)>’
typedef typename result_of<_Callable(_Args...)>::type result_type;
^
/usr/include/c++/4.8/functional:1727:9: error: no type named ‘type’ in ‘class std::result_of<void (*(std::vector<std::basic_string<char> >, std::reference_wrapper<std::vector<std::basic_string<char> > >))(std::vector<std::basic_string<char> >&, std::vector<std::basic_string<char> >&)>’
_M_invoke(_Index_tuple<_Indices...>)
^
make: *** [prog.o] Error 1
查看错误消息,func()
vector参数是按引用传递而不是按值传递。尝试使用std::ref(*it)
线程函数的参数按值复制。如果一个引用参数需要传递给线程函数,它有要被包装(例如用std::ref或std::cref)。
的例子:
#include <vector>
#include <thread>
#include <iostream>
void func(const std::vector<int>& value)
{
std::cout << "Value: " << value.size() << std::endl;
}
int main(int argc, char const *argv[])
{
std::vector<std::vector<int>> values =
{ { 1, 2 } , { 1, 2, 3 }, { 1, 2, 3, 4 } };
std::vector<std::thread> threads;
for (auto& vect: values)
{
threads.emplace_back(func, std::cref(vect));
}
for (auto& thread: threads)
{
thread.join();
}
return 0;
}
(顺便说一句,如果有一个完整的自包含示例,诊断会容易得多)。
相关文章:
- 为什么一个向量上的多线程操作很慢
- C++在不同线程中改变向量
- C++:在多个线程中访问同一数组/向量的不同单元格是否会产生数据竞赛?
- 在线程函数中处理数据向量时进行线程竞速
- std::vector::clear()ing 二维向量线程的内部向量安全吗?
- 在不同的线程中调用向量析构函数或清除
- 为同一向量C++运行多个线程时出现分段错误
- 具有多线程支持的 RenderClass,将函数调用推送到向量以在另一个线程上调用
- C++中向量和列表的非写入成员函数的线程安全性
- 在向量上声明缩减,在 1 个线程上运行给出的结果与没有 openmp 的结果不同
- 为什么向量"emplace_back"在多个线程中的行为比单个线程慢得多
- 由 std::shared_ptr 向量指向的数据之间的线程同步
- 在 Valgrind 输出中仍然可以访问 std 线程向量的块
- 在为工作线程访问 lambda 中捕获的向量列表中的元素引用时,是否需要互斥锁?
- C++重用调用同一函数的线程向量
- 在 C++11 中计算字母和单词的双字母组合的 std::线程向量的问题
- 在循环中创建线程向量的问题
- 提升多线程向量的返回值
- 尝试用函数填充线程向量 - 错误
- 多线程向量