2017-02-14 7 views
0

У меня есть объект класса AI, который имеет частную нестационарную функцию void, которая имеет много аргументов: minmax(double& val,double alpha, double beta, unsigned short depth, board* thisTurn); потому что это очень интенсивная функция, я хочу использовать несколько потоков для ее запуска одновременно, поэтому я должен создать поток с этой функцией внутри другой функции внутри класса AI;создавать потоковые функции класса с аргументами внутри класса

Согласно This question, чтобы потоки внутри функций-членов содержащих нерастворимые статических функций Wiht без аргументов упомянутого класса, один должны вызвать:

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

и в соответствии с this tutorial нитей fucntions с несколькими аргументами могут быть создана например:

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

где функция 'Foo' имеет 2 целочисленных аргумента

Однако я хочу смешать их с вещами, вызвать функцию, которая имеет аргументы, которая также является нестационарной функцией-членом, изнутри класса, членом которого она является, и я не уверен, как их смешивать с вещами.

Я с курса пытался (помните, что он находится внутри функции внутри класса AI):

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

и

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

Но в обоих случаях не удается с ошибкой компиляции, как это:

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

Мой вопрос в том, что если или нет, это даже возможно - изнутри функции-члена ion класса - вызов нестационарной функции-члена, которая имеет несколько аргументов в качестве потока, и, если это так, как это делается.

Этот вопрос, однако, не имеет значения, или нет, это хорошая идея использовать многопоточность в моем конкретном случае.

Редактировать

После выполнения некоторых испытаний я понял, что я не могу вызывать функции с аргументами, резьб на всех, функции даже не-нечленов только с одним аргументом, которая вызывается непосредственно из основной, это, однако решить, попросив this other question где я понял, что мне просто нужно добавить флаг -std = C++ 11 (потому что макросы с гарантией не всегда используют все возможности C++ 11 в качестве стандарта), после чего ответ работает нормально.

+0

попробовать 'станд :: поток т (& AI :: MINMAX, это, станд :: исх (Val), альфа, бета, глубина, thisTurn, это);' –

+0

@PiotrSkotnicki это приводит к той же ошибке, что и раньше, и эта новая ошибка '' не соответствующая функция для вызова '__invoke'' – Nikolaj

+0

показать код, или он никогда не был –

ответ

0

Вам необходимо обернуть ссылки, используя std::ref. Следующий пример компилируется нормально:

#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(); 
} 
+0

, что код примера все еще вызывает две ошибки: во-первых: std :: ref причина ошибка компилятора: 'ошибка: никакой подходящей функции для вызова к '__invoke'' следуют несколько строк:' ... в файле, включенном из ... ' но в конце указывает, что проблема заключается в 'std :: ref (val)'. Во-вторых, это приводит к тому, что старый конструктор-конструктор «nod» для инициализации шаблона-конструктора кандидатов «std :: thread» не является жизнеспособным: требуется один аргумент «__f», но Предоставлено 7 аргументов « – Nikolaj

+0

@Nikolaj Код, который я разместил, хорошо компилируется в Visual Studio 2015 (см. Http://rextester.com/ALGB12143). У меня нет VS2013 здесь, чтобы протестировать код, а более ранние версии не будут работать, потому что там '#include ' там отсутствует. Какой компилятор вы используете? – pschill

Смежные вопросы