как передать функции agruments (указатель, ссылка) в «новый поток» и ожидать возвращаемого значения?

#c #multithreading #function #return #pthreads

#c #многопоточность #функция #Возврат #pthreads

Вопрос:

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

     class tictactoe
    {
    ...
    ..
    .
    };
    
    class AI {
    public:
        int pickSpot(tictactoe* game){
             t =  new thread([this]() {findOptions(game);} );
             return 0;
        }
        
        int findOptions(tictactoe* game){ return 0;}
    };
  

приводит к ошибке:
ошибка: переменная ‘game’ не может быть неявно записана в лямбда-выражении без указания захвата по умолчанию

как это делается?

Комментарии:

1. [this] -> [this, game]

2. спасибо, одна проблема устранена.

3. или : t = новый поток([this]( auto game_arg ) { findOptions( game_arg ); } ,игра);

Ответ №1:

Чтобы получить возвращаемое значение, вы можете использовать std::future и std::async:

 #include <future>
#include <thread>

int pickSpot(tictactoe* game){
    std::future<int> f = std::async(std::launch::async, [this, game]() { return findOptions(game); });
    f.wait();
    int res = f.get();
    return res;
}
  

Комментарии:

1. спасибо, но … ошибка: нет жизнеспособного преобразования из ‘future<__async_result_of<(lambda at /TICTACTOE/main.cpp: 268:61)>>’ в ‘future<int>’

2. /usr/include/c /9/future:779: конструктор-кандидат нежизнеспособен: неизвестно преобразование из ‘future<__async_result_of<(lambda at /TICTACTOE/main.cpp: 268:61)> >’ (он же ‘future<void>’) в ‘std::future<int> amp;amp;’ для 1-го аргумента