For a programming languages class I have to write a program which concurrently sorts an array of 20 strings using bubble sort, first sorting 4 subarrays, then 2 combined subarrays, and finally the entire array. The code I wrote looks as follows:
#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;
}
However, running the code in visualstudio 2015 gives the following error:
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> ]
Which leads me to believe that the sort function is receiving 4 arguments instead of 3. What is happening here?