是否可以编写可以在 HPX 和 C++1x 线程之间切换的代码?

Posted

技术标签:

【中文标题】是否可以编写可以在 HPX 和 C++1x 线程之间切换的代码?【英文标题】:Is it possible to write code that can switch between HPX and C++1x thread? 【发布时间】:2016-08-26 15:13:52 【问题描述】:

由于hpx#include<thread> 之间的API 非常相似,是否有可能让相同的代码能够运行hpx#include<thread>

由于 boost 是 hpx 的要求,我的用例是有些系统不允许 boost 和一些系统,我希望在两者上运行相同的代码,但如果可能的话使用 hpx

假设我只使用 hpx 和线程中的功能,是否有这样做的示例?我什至可以通过#ifdef 吗?

【问题讨论】:

【参考方案1】:

如果两个库的 API 完全相同,则可以使用有条件编译的类型别名:

#if defined(USE_HPX_THREADS)

#include <hpx/thread.hpp>

namespace my_library

    using my_thread = hpx::thread;


#elif defined(USE_STD_THREADS)

#include <thread>

namespace my_library

    using my_thread = std::thread;


#endif

或者,如果 API 不同,您可以创建自己的同构接口,根据预处理器定义使用不同的实现:

class my_thread 

private:
    // "Conditional type alias" like the example above.
    my_thread_handle _thread;

public:
    void join();
;

#if defined(USE_HPX_THREADS)

void my_thread::join()

    _thread.hpx_join();


#elif defined(USE_STD_THREADS)

void my_thread::join()

    _thread.std_join();


#endif

在不同的文件中分离实现可能是个好主意。查看 SFML for a real-world example 等库 (Unix 和 Win32 文件夹)

【讨论】:

【参考方案2】:

std::threadhpx::thread 的 API 完全相同,因此 Vittorio 描述的 using 技巧可以解决问题。

【讨论】:

事实上,我们已经使用这种技术将 InnCabs 基准套件移植到 HPX(请参阅 github.com/STEllAR-GROUP/inncabs/blob/master/include/…)

以上是关于是否可以编写可以在 HPX 和 C++1x 线程之间切换的代码?的主要内容,如果未能解决你的问题,请参考以下文章

G.1X 和 G.2X 的 AWS Glue 工作线程定价详细信息

hpx::dataflow 和成员函数的编译错误

为啥 HPX 要求未来的“那么”成为 DAG(有向无环图)的一部分?

是否可以在用于更传统数据集 (CIFAR-10/MNIST) 的 CNN 模型中使用高光谱 1x1 像素的集合?

是否可以在线程中对非托管函数执行C#回调?

如何用c++builder 编写多线程