将 Lambda 传递给 pthread_create?

问题描述 投票:0回答:2

我在整个网络上搜索答案,但找不到任何解决方案。你能帮忙吗?

我的问题是我试图将 Lambda 发送到另一个函数并使用

Pthread
库跨多个线程运行 lambda。这是代码:

#include <iostream>
#include <stdlib.h>
#include <pthread.h>
#include <vector>

using namespace std;

template<class InputIt, class Function>
inline Function parallel_fun(InputIt first, InputIt last, Function f)
{
    pthread_t threads[4];
    for (int i=0; first != last; ++first) {
        pthread_create(&threads[i], nullptr,f , nullptr);
        i++;
    }

    for (int i=0; i<4;i++) {
        pthread_join(threads[i],nullptr);
    }
    return f;
}

int main()
{
    int z=90;
    vector<int> a(4);
    a[0]=1; a[1]=2;
    parallel_fun(a.begin(), a.end(), [=](void* data) -> void*
    {
        cout<<"test"<<z<<endl;   //do something
    });

    return 0;
}

我使用以下内容进行编译:

g++ -std=c++0x -pthread test.cpp -o a

我收到此错误:

test.cpp: In function ‘Function parallel_fun(InputIt, InputIt, Function) [with InputIt = __gnu_cxx::__normal_iterator<int*, std::vector<int> >, Function = main()::<lambda(void*)>]’:
test.cpp:44:11:   instantiated from here
test.cpp:16:10: error: cannot convert ‘main()::<lambda(void*)>’ to ‘void* (*)(void*)’ for argument ‘3’ to ‘int pthread_create(pthread_t*, const pthread_attr_t*, void* (*)(void*), void*)’
c++ c++11 lambda pthreads
2个回答
6
投票

我不确定新的 C++11 API。我觉得我还不够 是时候学习新的 API 了。

这是你的幸运日。 C++11 API 深受 pthread 的影响。 几乎是机械翻译。 这是 C++11 中的代码:

#include <iostream>
#include <stdlib.h>
#include <thread>
#include <vector>

template<class InputIt, class Function>
inline
Function
parallel_fun(InputIt first, InputIt last, Function f)
{
    std::thread threads[4];
    for (int i=0; first != last; ++first)
    {
        threads[i] = std::thread(f);
        i++;
    }
    for (int i=0; i<4;i++)
    {
        threads[i].join();
    }
    return f;
}


int main()
{
    int z=90;
    std::vector<int> a(4);
    a[0]=1; a[1]=2;
    parallel_fun(a.begin(), a.end(), [=]()
                                      {
                                        std::cout<<"test" << z << std::endl;
                                        //do something
                                      });
}

您的替代方案是弄清楚如何在 pthread 之上实现

std::thread
,相信我,这比上面显示的 C++11 翻译要复杂得多。


3
投票

没有从 lambda 到函数指针的转换 除非 lambda 没有捕获。 (§5.1.2p6)。因此,如果您需要捕获

z
,那您就不走运了。

C 接口希望您为闭包使用

void*
参数。您可以这样做,但这会很丑陋(但类似于 C),或者您可以使用新的 C++11 线程支持库(如果您的 C++ 环境支持的话)。

© www.soinside.com 2019 - 2024. All rights reserved.