泛化c++ 11 Threads类以使用lambda

Generalizing C++11 Threads class to work with lambda

本文关键字:lambda c++ Threads 泛化      更新时间:2023-10-16

我有一个基于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 );
}