0

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?

Gerome Schutte
  • 184
  • 1
  • 11

0 Answers0