【问题标题】:Asynchronous function calls in C++C++ 中的异步函数调用
【发布时间】:2012-09-16 23:36:40
【问题描述】:

这是我在 Java 中用于在 Java 中进行异步函数调用的一些代码:

    public class AsyncLogger
    {
        public static asyncLog = null;
        public static ExecutorService executorService = Executors.newSingleThreadExecutor();

        public static AsyncLogger GetAsyncClass()
        {
            if(asyncLog == null)
            {
                asyncLog= new AsyncLogger();
            }
            return asyncLog;
        }


        public void WriteLog(String logMesg)
        {
            executorService.execute(new Runnable()
            {
                public void run()
                {
                    WriteLogDB(logMesg);
                }
            });
                }

                public void ShutDownAsync()
                {
                    executorService.shutdown();
        }
    }

这是一个带有静态 ExecutorService 的 Singleton 类,WriteLogDB 将作为异步函数调用。所以我可以在不影响主流程的情况下异步处理我在 WriteLogDB 中的代码。

我能得到这样的 C++ 等价物吗?

【问题讨论】:

    标签: c++ asynchronous


    【解决方案1】:
    std::thread([](){WriteLogDB(logMesg);}).detach();
    

    或者如果您需要等待结果:

    auto result = std::async(std::launch::async, [](){WriteLogDB(logMesg);});
    // do stuff while that's happening
    result.get();
    

    如果您坚持使用 2011 年之前的编译器,那么就没有标准的线程工具;你需要使用像Boost 这样的第三方库,或者滚动你自己的、特定于平台的线程代码。 Boost 有一个类似于新标准类的线程类:

    boost::thread(boost::bind(WriteLogDB, logMesg)).detach();
    

    【讨论】:

    • 也称为fire_and_forget([]{ WriteLogDB(logMsg); });。 :) E:你为什么把 lambda 改成bind
    • @ManikandarajS:第一个版本肯定会。二是实现定义;它可能会创建一个线程,或者它可能使用线程池或其他东西。
    • @Xeo:因为我更喜欢bind。我会把 lambda 放回去,作为那些喜欢曲线的人的替代品。
    • 对于那些喜欢性能的人来说,bind 并不是世界上最快的东西。 :)
    • @Mike 我不想为每个函数调用创建单独的线程,这很困难。我可以在一个线程池中运行 3 或 4 个线程并尝试异步调用
    【解决方案2】:

    您可以在 C++11 中使用 std::async 进行异步函数调用。

    【讨论】:

    猜你喜欢
    • 2012-07-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-20
    • 1970-01-01
    • 1970-01-01
    • 2015-03-19
    • 2015-01-22
    相关资源
    最近更新 更多