线程函数的参数数量不正确

时间:2016-10-17 15:58:18

标签: c++ multithreading c++11 visual-studio-2015

对于编程语言类,我必须编写一个程序,它使用冒泡排序同时对20个字符串的数组进行排序,首先排序4个子数组,然后是2个组合子数组,最后是整个数组。我写的代码如下:

#include <thread>
#include <fstream>
#include <iostream>
#include <string>
#include <vector>
#include <atomic>
#include <mutex>

std::mutex m;

void sort(std::vector<std::string>::iterator begin, std::vector<std::string>::iterator end, std::atomic<short>& counter) {
    //code that sorts string vector
}

int main(int argc, char ** argv) {

    std::vector<std::string> initialInput;

    //initialize initialInput by reading from file

    //init counter var
    std::atomic<short> counter = 0;

    //run the first four threads
    std::thread thread1(sort, initialInput.begin(), (initialInput.begin() + 5), counter),
        thread2(sort, (initialInput.begin() + 5), (initialInput.begin() + 10), counter),
        thread3(sort, (initialInput.begin() + 10), (initialInput.begin() + 15), counter),
        thread4(sort, (initialInput.begin() + 15), (initialInput.begin() + 20), counter);

    //wait for all threads to finish
    thread1.join();
    thread2.join();
    thread3.join();
    thread4.join();

    //run the next two threads
    std::thread thread5(sort, initialInput.begin(), (initialInput.begin() + 10), counter),
        thread6(sort, (initialInput.begin() + 10), (initialInput.begin() + 20), counter);

    //wait for all threads to finish
    thread5.join();
    thread6.join();

    /*
        Since we will be waiting for the final thread to finish executing anyways, and the current (main program)
        thread has nothing to do while it waits for this execution, we can use the current thread to do the final
                sorting.
    */

    sort(initialInput.begin(), (initialInput.begin() + 20), counter);

    std::cout << "Number of moves: " << counter << std::endl;

    return 0;
}

但是,在visualstudio 2015中运行代码会出现以下错误:

c:\program files (x86)\microsoft visual studio 14.0\vc\include\memory(1630): error C2661: 'std::tuple<void (__cdecl *)(std::_Vector_iterator<std::_Vector_val<std::_Simple_types<std::basic_string<char,std::char_traits<char>,std::allocator<char>>>>>,std::_Vector_iterator<std::_Vector_val<std::_Simple_types<std::basic_string<char,std::char_traits<char>,std::allocator<char>>>>>,std::atomic<short> &),std::_Vector_iterator<std::_Vector_val<std::_Simple_types<std::basic_string<char,std::char_traits<char>,std::allocator<char>>>>>,std::_Vector_iterator<std::_Vector_val<std::_Simple_types<std::basic_string<char,std::char_traits<char>,std::allocator<char>>>>>,std::atomic<short>>::tuple': no overloaded function takes 4 arguments
1>  c:\program files (x86)\microsoft visual studio 14.0\vc\include\thread(50): note: see reference to function template instantiation 'std::unique_ptr<std::tuple<void (__cdecl *)(std::_Vector_iterator<std::_Vector_val<std::_Simple_types<std::basic_string<char,std::char_traits<char>,std::allocator<char>>>>>,std::_Vector_iterator<std::_Vector_val<std::_Simple_types<std::basic_string<char,std::char_traits<char>,std::allocator<char>>>>>,std::atomic<short> &),std::_Vector_iterator<std::_Vector_val<std::_Simple_types<std::basic_string<char,std::char_traits<char>,std::allocator<char>>>>>,std::_Vector_iterator<std::_Vector_val<std::_Simple_types<std::basic_string<char,std::char_traits<char>,std::allocator<char>>>>>,std::atomic<short>>,std::default_delete<_Ty>> std::make_unique<std::tuple<void (__cdecl *)(std::_Vector_iterator<std::_Vector_val<std::_Simple_types<std::basic_string<char,std::char_traits<char>,std::allocator<char>>>>>,std::_Vector_iterator<std::_Vector_val<std::_Simple_types<std::basic_string<char,std::char_traits<char>,std::allocator<char>>>>>,std::atomic<short> &),std::_Vector_iterator<std::_Vector_val<std::_Simple_types<std::basic_string<char,std::char_traits<char>,std::allocator<char>>>>>,std::_Vector_iterator<std::_Vector_val<std::_Simple_types<std::basic_string<char,std::char_traits<char>,std::allocator<char>>>>>,std::atomic<short>>,void(__cdecl &)(std::_Vector_iterator<std::_Vector_val<std::_Simple_types<std::basic_string<char,std::char_traits<char>,std::allocator<char>>>>>,std::_Vector_iterator<std::_Vector_val<std::_Simple_types<std::basic_string<char,std::char_traits<char>,std::allocator<char>>>>>,std::atomic<short> &),std::_Vector_iterator<std::_Vector_val<std::_Simple_types<std::basic_string<char,std::char_traits<char>,std::allocator<char>>>>>,std::_Vector_iterator<std::_Vector_val<std::_Simple_types<std::basic_string<char,std::char_traits<char>,std::allocator<char>>>>>,std::atomic<short>&>(void (__cdecl &)(std::_Vector_iterator<std::_Vector_val<std::_Simple_types<std::basic_string<char,std::char_traits<char>,std::allocator<char>>>>>,std::_Vector_iterator<std::_Vector_val<std::_Simple_types<std::basic_string<char,std::char_traits<char>,std::allocator<char>>>>>,std::atomic<short> &),std::_Vector_iterator<std::_Vector_val<std::_Simple_types<std::basic_string<char,std::char_traits<char>,std::allocator<char>>>>> &&,std::_Vector_iterator<std::_Vector_val<std::_Simple_types<std::basic_string<char,std::char_traits<char>,std::allocator<char>>>>> &&,std::atomic<short> &)' being compiled
1>          with
1>          [
1>              _Ty=std::tuple<void (__cdecl *)(std::_Vector_iterator<std::_Vector_val<std::_Simple_types<std::basic_string<char,std::char_traits<char>,std::allocator<char>>>>>,std::_Vector_iterator<std::_Vector_val<std::_Simple_types<std::basic_string<char,std::char_traits<char>,std::allocator<char>>>>>,std::atomic<short> &),std::_Vector_iterator<std::_Vector_val<std::_Simple_types<std::basic_string<char,std::char_traits<char>,std::allocator<char>>>>>,std::_Vector_iterator<std::_Vector_val<std::_Simple_types<std::basic_string<char,std::char_traits<char>,std::allocator<char>>>>>,std::atomic<short>>
1>          ]
1>  c:\users\gerome\documents\visual studio 2015\projects\cos333prac5\cos333prac5\standardimpl.cpp(81): note: see reference to function template instantiation 'std::thread::thread<void(__cdecl &)(std::_Vector_iterator<std::_Vector_val<std::_Simple_types<std::basic_string<char,std::char_traits<char>,std::allocator<char>>>>>,std::_Vector_iterator<std::_Vector_val<std::_Simple_types<std::basic_string<char,std::char_traits<char>,std::allocator<char>>>>>,std::atomic<short> &),std::_Vector_iterator<std::_Vector_val<std::_Simple_types<std::basic_string<char,std::char_traits<char>,std::allocator<char>>>>>,std::_Vector_iterator<std::_Vector_val<std::_Simple_types<std::basic_string<char,std::char_traits<char>,std::allocator<char>>>>>,std::atomic<short>&,void>(_Fn,std::_Vector_iterator<std::_Vector_val<std::_Simple_types<std::basic_string<char,std::char_traits<char>,std::allocator<char>>>>> &&,std::_Vector_iterator<std::_Vector_val<std::_Simple_types<std::basic_string<char,std::char_traits<char>,std::allocator<char>>>>> &&,std::atomic<short> &)' being compiled
1>          with
1>          [
1>              _Fn=void (__cdecl &)(std::_Vector_iterator<std::_Vector_val<std::_Simple_types<std::basic_string<char,std::char_traits<char>,std::allocator<char>>>>>,std::_Vector_iterator<std::_Vector_val<std::_Simple_types<std::basic_string<char,std::char_traits<char>,std::allocator<char>>>>>,std::atomic<short> &)
1>          ]

这让我相信sort函数正在接收4个参数而不是3.这里发生了什么?

0 个答案:

没有答案