Как исправить: выполнение лямбда-выражения с использованием pthread в c ++ - PullRequest
0 голосов
/ 07 января 2019

У меня есть файл main.cpp, где у меня есть следующий код

paral(start, end, [&](int i){
    C1[i] = A1[i] + B[i];
}, numThreads);`

У меня есть paral определение в otherfile.cpp, где у меня есть следующий код

void paral(int start, int end, T &&lambda, int nT){
    pthread_t thread1;
    int status = pthread_create(&thread1, NULL,lambda ,1);//Should execute lambda(1)
    lambda(2);//Executed by main thread
    //Code for join and so on
}

Там написано:

не может преобразовать лямбду в (void *) (*) (void *).

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

1 Ответ

0 голосов
/ 07 января 2019

Вы должны преобразовать лямбду в std :: function. Следующий код демонстрирует подход. У меня нет установленных потоков. Поэтому вместо этого я использую функцию _beginthread, которая аналогична.

#include <process.h>
#include <Windows.h>

#include <iostream>
#include <functional>

using thread_start = std::function<void ()>;

void function_executor( void* arg ) {
    // Convert void* to std::function back and execute it
    auto ts = reinterpret_cast<thread_start*>( arg );
    (*ts)();
}

template<typename Handler>
void paral(int start, int end, Handler &&handler, int nT){

    for( ; start < end; ++start ) {
        // Create instance of thread_start (capture argument)
        thread_start func = std::function( [&, i = start] { handler(i); } );

        // ... and pass all this to the newly created thread
        auto cpp_handle = _beginthread( function_executor, 0, &func );

        // Wait for thread complete
        if( -1 != cpp_handle ) {
            auto win_handle = reinterpret_cast<HANDLE>( cpp_handle );
            WaitForSingleObject( win_handle, INFINITE );
        }


    }
}    

int main() {
    int C1[10], A1[10], B[10];
    paral(0, 10, [&](int i){ C1[i] = A1[i] + B[i]; }, 1);
    std::cout << "Done. Bye!" << std::endl;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...