使用 lambda 启动一个具有 class 属性的线程

use a lambda to start a thread which is a class attribute

我想给一个线程分配一个名字,线程本身必须这样做。该线程是 class foo 的 class 成员。 我想用 lambda 开始这个线程,但不幸的是我收到错误消息: 不匹配调用'(std::thread) (foo::start()::)

有人可以向我解释一下问题出在哪里吗? 之前我已经创建了一个临时线程对象,并将其移动到线程“管理”上,但是,我不能给出任何名称。

class foo {

    public:

        int start()
        {
            this->manage([this](){
            auto nto_errno = pthread_setname_np(manage.native_handle(),"manage");           // Give thread an human readable name (non portable!)
              while(1){
                  printf("do work");
              }
            });
            return 1;
        }

    private:
        int retVal;

        std::thread manage;

};

您以错误的方式传递了 lambda,初始化后无法再次初始化管理线程。您应该创建一个新的 std::thread 并分配它。 以下编译并确实打印“管理”。

class foo {

    public:

        int start()
        {
            manage = std::thread([this]{
              auto nto_errno = pthread_setname_np(manage.native_handle(),"manage");
              char name[16];
              pthread_getname_np(pthread_self(), &name[0], sizeof(name));   
              cout << name << endl;
            });
            manage.join();
            return 1;
        }

    private:
        int retVal;

        std::thread manage;

};