繁体   English   中英

如何在C ++ 11的Mac OS X上命名std :: thread?

[英]How to name std::thread on Mac OS X in C++11?

我想命名一个线程,但是不幸的是,Mac上的pthread_setname_np()仅在当前线程内有效。

然后,我使用以下构造函数对std::thread进行包装:

template <class F, class ... Args>
Thread::Thread(const char* name, F&& f, Args&&... args) {
  thread_ = std::thread([name, f, args...]() {
    pthread_setname_np(name);
    f(args...);
  });
}

但这不适用于类方法:

error: called object type '<complex type>' is not a function or function pointer
f(args...);
^

在这样的代码中:

threads_.emplace_back("Name", &Aggregator<T>::DoPop, this, some_arg);

包装std::thread并设置线程名称,保留整个接口(构造函数中的name参数除外)的正确方法是什么?

您必须将成员函数绑定到类实例。 这是与(工作)测试稍有不同的功能:

#include <iostream>
#include <thread>

template <class F, class ... Args>
std::thread launch_named_thread(const char* name, F&& f, Args&&... args) {
    return std::thread([name, f, args...]() {
        pthread_setname_np(name);
        f(args...);
    });
}

struct myclass
{
    void thread_loop(int i)
    {
        std::cout << i << std::endl;
    }
};

auto main() -> int
{
    myclass x;
    auto t = launch_named_thread("hello", std::bind(&myclass::thread_loop, &x, 6));
    // this could be:
    // auto t = launch_named_thread("hello", std::bind(&myclass::thread_loop, &x, std::placeholders::_1), 6);
    // the difference is subtle. i'll leave it to you to work out why
    t.join();

    return 0;
}

您可以使用std::mem_fn调用成员函数。 args中的第一个参数必须是指向成员对象的指针。

例:

#include <thread>
#include <functional>

template <class F, class ... Args>
std::thread thread_factory(const char* name, F&& f, Args&&... args) {
  return std::thread([=]{
    pthread_setname_np(name);
    auto fun = std::mem_fn(f);
    fun(args...);
  });
}

struct test {
  int t(int val) {
    return val;
  }
};

int main() {
  test t;
  auto b = thread_factory("name", &test::t, &t, 5);
  b.join();
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM