泛化c++ 11 Threads类以使用lambda
Generalizing C++11 Threads class to work with lambda
我有一个基于pthreads的简单Threads类,它可以很好地与标准静态回调函数配合使用。
是否有可能泛化线程与lambda一起工作?
问题:
-
sandbox.cpp:27:26:错误:从类型' main(int, char*):: '转换为类型' void '
-
thread_cb()
需要处理一般将void*
转换回可调用的东西
我怀疑第二个问题可以通过模板方法或std::function来解决,但不确定如何解决。
#include <vector>
#include <iostream>
#include <pthread.h>
class Threads
{
public:
Threads() { }
~Threads() { }
private:
static void *thread_cb( void *v )
{
// following will also need to change
void (*my_fptr)() =
reinterpret_cast<void(*)()>(reinterpret_cast<long long>(v));
my_fptr();
return nullptr;
}
public:
template<typename CALLBACK>
void spawn( CALLBACK cb )
{
pthread_t t;
void *p = (void*)( cb ); // problem here
pthread_create( &t, nullptr, thread_cb, p );
m_threads.push_back( t );
}
void join_all()
{
for ( auto& p : m_threads )
pthread_join( p, nullptr );
}
private:
std::vector< pthread_t > m_threads;
};
static void my_cb()
{
std::cerr << "bar" << std::endl;
}
int main(int argc, char** argv)
{
Threads t;
t.spawn( my_cb ); // ok
t.spawn( []() { std::cerr << "foo" << std::endl; } ); // not ok
t.join_all();
return 0;
}
可以使用"lambda to function pointer"转换. ...尽管如此,我还是强烈推荐std::thread
。
template<typename CALLBACK>
void spawn( CALLBACK cb )
{
pthread_t t;
// void *p = (void*)( cb );
// pthread_create( &t, nullptr, thread_cb, p );
void (*pfn)() = cb; // function pointer to `void()`
pthread_create( &t, nullptr, thread_cb, reinterpret_cast<void*>(pfn) );
m_threads.push_back( t );
}
相关文章:
- lambda参数转换为constexpr技巧,然后获取带链接的数组
- 可组合的lambda/std::函数与std::可选
- C++Boost Asio Pool线程,带有lambda函数和传递引用变量
- 如何建立使用模板函数的lambda函数的尾部返回类型
- 如何将lambda作为模板类的成员函数参数
- C++从其他 constexpr 创建 lambda 不能按顺序执行 Constexpr
- 在 lambda 捕获中声明的变量的类型推导
- 我可以将调用类的"this"传递给 lambda 函数吗?
- 为什么lambda在clang上崩溃而不是在gcc上崩溃
- 模板函数指针和lambda
- 两组使用lambda函数的大括号
- 使lambda不可复制/不可移动
- FLTK:按下哪个按钮 - 将数字传递给按钮的回调 (lambda)
- 尝试将lambda函数放在队列中时出现一般分配器错误(可能是与unique_ptr有关的错误)
- 将带有unique_ptr的可变 lambda 传递给 const&std::function
- AWS Lambda C++运行时权限被拒绝
- 捕获lambda中的std::数组
- 这 4 个 lambda 表达式之间有什么区别?
- 在实现文件中使用头文件的通用 lambda
- 我可以在这里替换什么,因为我不能在 C# 中使用隐式变量的 lambda 函数?