我在网上搜索答案,但我找不到任何解决方案。你能帮忙吗?
我的问题是我正在尝试将Lambda发送到另一个函数并使用Pthread
库来跨多个线程运行lambda。接下来是代码:
1 #include <iostream>
2 #include <stdlib.h>
3 #include <pthread.h>
4 #include <vector>
5
6 using namespace std;
7
8
9 template<class InputIt, class Function>
10 inline Function parallel_fun(InputIt first, InputIt last, Function f)
11 {
12 pthread_t threads[4];
13
14 for (int i=0; first != last; ++first) {
15
16 pthread_create(&threads[i], nullptr,f , nullptr);
17
18 i++;
19 }
20
21 for (int i=0; i<4;i++) {
22
23 pthread_join(threads[i],nullptr);
24
25
26 }
27
28
29
30
31 return f;
32 }
33
34
35 int main()
36 {
37 int z=90;
38 vector<int> a(4);
39 a[0]=1; a[1]=2;
40 parallel_fun(a.begin(), a.end(), [=](void* data) -> void*
41 {
42 cout<<"test"<<z<<endl;
43 //do something
44 });
45
46
47
48 return 0;
49 }
我使用以下行编译:{{1}}
我收到此错误:
g++ -std=c++0x -pthread test.cpp -o a
答案 0 :(得分:5)
我不确定新的C ++ 11 API。我觉得我没够 是时候学习新的API。
这是你的幸运日。 C ++ 11 API受到pthreads的强烈影响。几乎有机械翻译。这是您在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
});
}
您的替代方案是弄清楚如何在pthreads之上实现std::thread
,而信任我的pthreads比上面显示的C ++ 11翻译要复杂得多。
答案 1 :(得分:2)
除非 lambda没有捕获,否则没有从lambda到函数指针的转换。 (§5.1.2p6)。因此,如果你需要捕获z
,那你就不走运了。
C接口希望您使用void*
参数作为闭包。你可以这样做,这将是丑陋的(但类似于C),或者你可以使用新的C ++ 11线程支持库,如果你的C ++环境支持它。