Search code examples
multithreadingc++11stdthread

create threaded class functions with arguments inside class


I have an object of class AI, which has a private non static void function which has a lot of arguments: minmax(double& val,double alpha, double beta, unsigned short depth, board* thisTurn); because this is a very time intensive function I want to use a number of threads to run it concurrently, therefor I must create a thread with this function inside another function inside the AI class;

According toThis question to make threads inside member functions containing non static member functions wiht no arguments of said class, one must call:

std::thread t(&myclass::myfunc,this);

And according to this tutorial threads of fucntions with multiple arguments can be created as such:

std::thread t(foo,4,5) 

where the function 'foo' has 2 integer arguments

However I desire to mix these to things, to call a function which has arguments, which is also a non static member function, from inside the class that it is a member of, and i am not sure how to mix these to things.

I have off course tried (remember that it is inside a function inside the AI class):

std::thread t(&AI::minmax,val,alpha,beta,depth,thisTurn,this);

and

std::thread t(&AI::minmax,this,val,alpha,beta,depth,thisTurn);

But both cases fails with a compile error like this:

error: no matching constructor for initialization of 'std::thread'
candidate constructor template not viable: requires single argument '__f', but
  7 arguments were provided

My question is therefor, if or if not, it is even possiple to -- from inside a member function of a class -- call a non static member function which has several arguments as a thread, and if this is the case, how it is done.

This question is however not wether or not it is a good idea to use multithreading in my specific case.

Edit

After doing some testing i realized that i can not call functions with arguments as threads at all, not even non-member functions with only one argument called directly from main, this was however solved by asking this other question where i realized that i simply need to add the flag -std=c++11 (because apparantly macs don't always use all c++11 features as standard) after doing so the answer works fine.


Solution

  • You need to wrap references using std::ref. The following example compiles fine:

    #include <iostream>
    #include <thread>
    
    class board;
    
    class AI
    {
    public:
    
        void minmax(double& val, double alpha, double beta, unsigned short depth, board* thisTurn)
        {
            std::cout << "minmax" << std::endl;
        }
    
        void spawnThread()
        {
            double val;
            double alpha;
            double beta;
            unsigned short depth;
            board* thisTurn;
    
            std::thread t(&AI::minmax, this, std::ref(val), alpha, beta, depth, thisTurn);
    
            t.join();
        }
    
    };
    
    int main()
    {
        AI ai;
        ai.spawnThread();
    }