使用异步方法与线程等待

时间:2011-04-12 05:38:41

标签: c++ optimization assembly

我有一个函数的2个版本,它们在C ++库中可用,它们执行相同的任务。一个是同步函数,另一个是异步类型,它允许注册回调函数。

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

  1. 在工作线程中调用同步函数,并使用互斥同步等到我得到结果
  2. 不要创建线程,而是调用异步版本并在回调中获得结果
  3. 我知道选项1中的工作线程创建会导致更多开销。我想知道与线程同步对象引起的开销有关的问题,以及它如何与异步调用引起的开销进行比较。函数的异步版本是否在内部分离线程并使用同步对象,还是使用其他一些技术来直接与内核通信?

3 个答案:

答案 0 :(得分:2)

“简介,不要推测。” (DJB)

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

“过早优化是所有邪恶的根源,比如97%的时间”(DEK)

更新以回复问题编辑:

通常,C ++库不会使用魔术来避免同步原语。异步与同步接口很可能是你要做的事情的包装器。处理必须在上下文中进行,如果要将完成信号发送到另一个上下文,则需要同步原语来执行此操作。

当然,可能还有其他一些考虑因素。如果您的C ++库正在与可以进行处理的某些硬件进行通信,那么情况可能会有所不同。但你没有告诉过我们这样的事情。

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

答案 1 :(得分:0)

使用异步函数,因为可能会使用同步函数手动执行您想要执行的操作但不易出错。

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

答案 2 :(得分:0)

您可能会认为每个线程都有自己的环境,因此当所有其他条件相同时,它们会使用比非线程解决方案更多的内存。

根据您的线程库,启动和停止线程也会产生很大的开销。

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

如果您习惯编写非线程代码(即您不会花费大量时间编写和调试它),那么这可能是最佳选择。