c++ - C++11 线程如何包裹 pthreads

标签 c++ multithreading c++11 pthreads posix

所以 C++11 线程是大多数系统上 pthreads 的包装器,我很困惑从可变参数函数到具有指定返回类型的更严格函数的语法如何工作(即带有 pthreads 的回调函数)可以有人能举个例子来说明吗?

最佳答案

假设您有一个 C 风格的界面,如下所示:

Foo run( Foo(*)(void*), void* );

你想写:

template<class F, class...Args>
std::result_of<F(Args...)>
smart_run( F&& f, Args&&... args );

这类似于在 pthreads 之上实现 std::thread 需要做的事情。我稍微简化了一些东西,因为它是噪音(没有标准引用支持,没有衰减等)。

第一步,获取FArgs... 并将它们绑定(bind)起来。类似 std::bind(f, args...) 的东西返回一个返回结果的零参数函数。

有了这个,我们只需要解决:

template<class F>
std::result_of<F()>
smart_run( F&& f );

它接受一个任意的可调用对象,然后使用上面的run 来运行它。

诀窍是在免费商店上创建一个 f 的拷贝和一个调用它的函数,如下所示:

template<class F>
std::result_of<F()>
smart_run( F&& f ){
  struct data{
    F f;
    std::result_of_t<F()> r;
  };
  data*p = new data{std::forward<F>(f)};
  Foo ignored=run(
    [](void* p){
      data* self=static_cast<data*>(p);
      auto& f=self->f;
      self->r = f();
      return Foo{}; // whatever
    },
    p
  );
  auto r=data->r;
  delete data;
  return r;
}

现在,r 是赋值的而不是构造的。但这个想法的核心 -- 您在 void* 中传递了奇特的可调用函数,然后函数解包它并与之交互,就完成了。

在 pthread 上的真实线程中,您会将指向 std::thread-state 的指针传递给 pthread 调用程序。它会设置任何东西,调用存储过程,完成后会获取返回值并将其存储在内部 std::thread 状态(如果需要)。然后您可以通过与内部 std::thread 状态交互来获取该数据。

或其他大致相同的内容。

关于c++ - C++11 线程如何包裹 pthreads,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34114001/

相关文章:

C++11 和多态 lambda 的缺失——为什么?

multithreading - 如何用时序图来说明多线程?

c# - 并发环境中的乱序加载

c++ - Clang 与 GCC - Variadic 模板参数包后跟具有默认值的参数在 GCC 4.8 中有效,但在 Clang 3.5 中无效

c++ - 如何在 C++ 中处理不同的模板参数?

c++ - munmap() 当进程共享文件描述符表而不是虚拟内存时

c++ - 如何调整 Eclipse 的 C++ 索引器?

java - JVM字符串池线程是本地的吗?它会导致此用例出现任何问题吗?

c++ - 将 BOOST_FOREACH 替换为 "pure"C++11 替代方案?

c++ - Range-for-loops 和 std::vector<bool>