Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 池异步对象以获得更好的性能_C++_Multithreading_C++11_Asynchronous - Fatal编程技术网

C++ 池异步对象以获得更好的性能

C++ 池异步对象以获得更好的性能,c++,multithreading,c++11,asynchronous,C++,Multithreading,C++11,Asynchronous,我读了一些关于std::async的书,到目前为止,我对我所学到的和尝试的东西感到有点失望 现在,我在后台“实现”了一个带有线程池的std::async替换程序,以试用我在空闲时间正在开发的游戏。async替换程序既不美观,也不优雅,也没有经过优化,但如果将它与std::launch::async标志一起使用,它的性能仍然优于std::async 代码非常简单: namespace util { template <class R, class T> std::future&

我读了一些关于std::async的书,到目前为止,我对我所学到的和尝试的东西感到有点失望

现在,我在后台“实现”了一个带有线程池的std::async替换程序,以试用我在空闲时间正在开发的游戏。async替换程序既不美观,也不优雅,也没有经过优化,但如果将它与std::launch::async标志一起使用,它的性能仍然优于std::async

代码非常简单:

namespace util
{
    template <class R, class T> std::future<R> async(const T& task)
    {
        std::shared_ptr<std::promise<R> > result = std::make_shared<std::promise<R> >();

        //threadctrl::run is a call which runs tasks on an engine-global thread pool, which get's injected on initialization
        threadctrl::run(std::bind([](std::shared_ptr<std::promise<R> > result, const T& task)->void
        {
            try
            {
                result->set_value(task());
            }
            catch (...)
            {
                //not handled here
            }

        }, result, std::ref(task)));

        return result->get_future();
    }
}
namespace-util
{
模板std::future async(const T&task)
{
std::shared_ptr result=std::make_shared();
//threadctrl::run是一个调用,它在引擎全局线程池上运行任务,在初始化时注入该线程池
threadctrl::run(std::bind([](std::shared_ptr result,const T&task)->void
{
尝试
{
结果->设置_值(任务());
}
捕获(…)
{
//这里不处理
}
},结果,标准::参考(任务));
返回结果->获取未来();
}
}
一个简单的用法示例如下所示:

int main()
{
    std::future<int> result = util::async<int>(std::bind(give5));

    //Do some other work

    std::cout << result.get();

    return 0;
}
intmain()
{
std::future result=util::async(std::bind(give5));
//做一些其他的工作

std::cout
std::async
被禁止使用tread池;它必须将启动的任务“视为”在单独的线程中运行。因此线程本地存储被清除,其中100个正在运行或被阻止的任务如果不争用,则不应阻止新的任务,等等

您的池不必做这些事情,因此可以更高效

请注意,在windows上,
std::async
实际上违反了这些假设。我在2017年读到了解决这一问题的计划,但通用汽车没有解决方案

您发布的代码很糟糕,因为它有一个悬而未决的引用,所以您可能不应该为此目的使用自己亲手编写的代码。编写线程代码很难。您会犯很多错误;如果您在一个很短的代码段中发生了这么大的错误,请想想线程池实现中一定有多少错误

我使用的是类似于线程池的东西,它不需要全局线程池。当我有一个可以使用大量并行性的任务时,我给它一个线程池,并在其上运行任务

这确实意味着,如果两个不同的任务同时运行,它们都需要大量的并行性,那么它们就会发生冲突。但是我不喜欢有一个单独的线程。你可以公开一个单独的线程池


请注意,线程池中的任务需要避免阻塞。为此,您可能希望为线程池任务提供获得延续的功能,或者提供访问“预期高阻塞”的功能如果你是基于Windows,你知道并发运行时和并行模式库吗?它们提供了C++标准库在这一领域的特征的超集。而且,像这样的微基准数字可能会产生很多怀疑,尤其是如果你没有支持的话。我使用了你用来生成它们的代码。嗯,我在玩不同的迷你游戏时安排了时间。谢谢,我会查找库,从来没有听说过…:)但是如果你好奇的话,我尝试了异步来计算空间入侵者的物理事件,比如我正在编写的游戏和侧滚射击游戏(这并不是因为我认为我会从并行性中获得很大的提升,而是因为我在使用它)。这里介绍了基本的尝试:简单的区别是,每个衍生的碰撞事件都会启动一个异步任务来计算物理量。我添加了一个计数器,并将在一些游戏中通过计数器收集的异步启动所花费的总时间除以。好的,首先,感谢你,我不知道异步的规则会阻止它不允许使用线程池,但我知道我应该避免阻塞任务。全局线程池是引擎全局的,这意味着它存储在引擎中,为了简单起见,可以从任何软件访问它。在我看来,为异步创建单独的池不是一个选项,因为我希望在一个特定点处理线程我对我的代码有什么特别不好的地方很感兴趣,因为我想改进它(好的,悬而未决的参考,但是还有更多吗?)@mango这将是代码检查。但是您的代码不必要地在堆上分配承诺,可能是因为您的运行程序需要可复制的对象。绑定是一个坏主意,请使用lambda或函数对象,使它们只运行一次。:“模板函数async异步运行函数f。”(可能在一个单独的线程中,该线程可能是线程池的一部分)……根据这一点,不禁止在线程池上运行。@这是一个不规范的脚本。@Yakk AdamNevraumont谢谢,我现在看得更清楚了。