我正在将多线程中值函数作为大型项目的一部分工作。我有一点C++经验。下面的中值函数应该采用3维向量的向量,并返回一个3维向量,其中每个条目是输入向量中该索引中所有条目的中值。所以如果输入是< < 3,2,1>,< 1,2,3>,< 2,2,2 >>,则返回< 2,2,2>。该代码将用于实现实时视频中的中值模糊,因此希望对其进行多线程处理。C++ 11线程:将向量传递给线程函数时出错
#include <thread>
#include <iostream>
#include <mutex>
#include <vector>
#include <algorithm>
#include "median.h"
// mutex to protect bgrPixel (possibly not needed)
std::mutex mtx;
std::vector<int> median(const std::vector<std::vector<int> >& input)
{
std::vector<int> bgrPixel; // Vector to store median BGR value
std::thread first(thread_function, bgrPixel, input, 0); // thread for each colour channel
std::thread second(thread_function, bgrPixel, input, 1);
std::thread third(thread_function, bgrPixel, input, 2);
first.join();
second.join();
third.join();
return bgrPixel;
}
void thread_function(std::vector<int>& bgrPixel, const std::vector<std::vector<int> >& input1, int channel)
{
std::vector<int> input = input1[channel]; // copy the colour channel
std::sort(input.begin(), input.end());
int size = input.size();
if (size %2 == 0) // get the median
{
mtx.lock();
bgrPixel[channel] = (input[size/2] + input[size/2 + 1])/2;
mtx.unlock();
} else
{
mtx.lock();
bgrPixel[channel] = input[(size-1)/2];
mtx.unlock();
}
}
我遇到的问题是,在编译时,G ++(和铛也)给出一个相当难以理解的错误:
g++ -std=c++11 -pthread -o median median.cpp
In file included from /usr/include/c++/4.8.2/thread:39:0,
from median.cpp:1:
/usr/include/c++/4.8.2/functional: In instantiation of ‘struct std::_Bind_simple<void (*(std::vector<int>, std::vector<std::vector<int> >, int))(std::vector<int>&, const std::vector<std::vector<int> >&, int)>’:
/usr/include/c++/4.8.2/thread:137:47: required from ‘std::thread::thread(_Callable&&, _Args&& ...) [with _Callable = void (&)(std::vector<int>&, const std::vector<std::vector<int> >&, int); _Args = {std::vector<int, std::allocator<int> >&, const std::vector<std::vector<int, std::allocator<int> >, std::allocator<std::vector<int, std::allocator<int> > > >&, int}]’
median.cpp:15:58: required from here
/usr/include/c++/4.8.2/functional:1697:61: error: no type named ‘type’ in ‘class std::result_of<void (*(std::vector<int>, std::vector<std::vector<int> >, int)) (std::vector<int>&, const std::vector<std::vector<int> >&, int)>’
typedef typename result_of<_Callable(_Args...)>::type result_type;
^
/usr/include/c++/4.8.2/functional:1727:9: error: no type named ‘type’ in ‘class std::result_of<void (*(std::vector<int>, std::vector<std::vector<int> >, int)) (std::vector<int>&, const std::vector<std::vector<int> >&, int)>’
_M_invoke(_Index_tuple<_Indices...>)
^
我已发现类似的错误消息c++11 Thread class how to use a class member function,但它不会特别处理我的问题。 任何帮助将不胜感激,我完全期待这是因为我不知道我在做什么:P
编辑:线程函数和中位数的原型包含在头文件median.h中。
当你得到这个编译您有一个更狡猾的问题:你的'bgrPixel'向量不包含三个项目,所以当你做'bgrPixel [channel] = ...'你有[*未定义的行为*](http://en.wikipedia.org/wiki/Undefined_behavior)。这可以很容易地通过说声明矢量有三个项目解决:'std :: vector bgrPixel(3);' –
由于您的向量的大小为3,您可以用'std'替换'std :: vector' :: array '。这将不太容易出错。我没有g ++编译器,但它可以很好地适用于VC++。可能你的编译器有问题。 –
谢谢! – chaffdog