Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/133.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
使用异步方法与线程等待 我有2个版本的函数,它们都在一个C++库中,它们执行相同的任务。一个是同步函数,另一个是异步类型,允许注册回调函数_C++_Optimization_Assembly - Fatal编程技术网

使用异步方法与线程等待 我有2个版本的函数,它们都在一个C++库中,它们执行相同的任务。一个是同步函数,另一个是异步类型,允许注册回调函数

使用异步方法与线程等待 我有2个版本的函数,它们都在一个C++库中,它们执行相同的任务。一个是同步函数,另一个是异步类型,允许注册回调函数,c++,optimization,assembly,C++,Optimization,Assembly,以下哪种策略更适合提供更好的内存和性能优化 在工作线程中调用同步函数,并使用互斥体同步来等待,直到得到结果 不要创建线程,而是调用异步版本并在回调中获取结果 我知道在选项1中创建工作线程会导致更多开销。我想知道与线程同步对象引起的开销相关的问题,以及它与异步调用引起的开销的比较。函数的异步版本是在内部剥离线程并使用同步对象,还是使用其他技术,如直接与内核对话?使用异步函数,因为它可能会手动执行同步函数,但不太容易出错 异步:将创建线程,完成工作,完成时->调用回调 同步:创建要等待的事件、创建工

以下哪种策略更适合提供更好的内存和性能优化

  • 在工作线程中调用同步函数,并使用互斥体同步来等待,直到得到结果
  • 不要创建线程,而是调用异步版本并在回调中获取结果

  • 我知道在选项1中创建工作线程会导致更多开销。我想知道与线程同步对象引起的开销相关的问题,以及它与异步调用引起的开销的比较。函数的异步版本是在内部剥离线程并使用同步对象,还是使用其他技术,如直接与内核对话?

    使用异步函数,因为它可能会手动执行同步函数,但不太容易出错

    异步:将创建线程,完成工作,完成时->调用回调
    同步:创建要等待的事件、创建工作线程、等待事件、线程调用同步版本、传输结果、信号事件。

    “配置文件,不要推测。”(DJB)

    这个问题的答案取决于太多的事情,而且没有一般的答案。开发人员的角色是能够做出这些决策。如果您不知道,请尝试选择并测量。在许多情况下,差异并不重要,非性能问题将占主导地位

    “过早的优化是万恶之源,比如说97%的时候”(戴克)

    更新以响应编辑问题:

    一般来说,C++库不会使用魔法来避免同步原语。异步与同步接口很可能是围绕您无论如何都要做的事情的包装器。处理必须在一个上下文中进行,如果要向另一个上下文发送完成信号,则需要一个同步原语来完成

    当然,可能还有其他考虑因素。如果C++库正在与某个可以处理的硬件进行对话,那么情况可能会有所不同。但你没有告诉我们类似的事情


    这个问题的答案取决于你没有给我们的上下文,包括关于库接口和代码结构的信息。

    你可能会认为每个线程都有自己的环境,所以当所有其他事物相等时,它们使用的内存多于非线程解决方案。

    根据线程库的不同,启动和停止线程可能会有很大的开销

    如果您需要进程间同步,那么调试线程代码也会有很多麻烦


    如果您对编写非线程代码感到满意(也就是说,编写和调试非线程代码不会花费太多时间),那么这可能是最佳选择。

    我们如何猜测一个我们没有相关信息且无法看到其源代码的库是如何实现的?只需尝试使用函数的两种形式并分析您的程序。我正在寻找一种典型异步函数的通用方法