2011-04-12 31 views
1

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

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

  1. 呼叫在辅助线程的同步功能,并使用互斥同步等到我得到的结果
  2. 不要创建一个线程,但调用的异步版本,并在回调得到的结果

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

+4

我们应该如何猜测一个图书馆我们没有任何信息并且无法看到源代码被实现?只要尝试使用这两种形式的功能和配置你的程序。 – Mankarse 2011-04-12 05:42:39

+0

我正在寻找一个典型的异步函数的一般方法 – paseena 2011-04-12 05:46:37

回答

0

使用异步功能,因为可能会做你想做的手动与同步,但较少出错。

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

2

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

这个问题的答案依赖于太多的东西,而且没有一般的答案。开发人员的角色是能够做出这些决定。如果您不知道,请尝试选项和措施。在很多情况下,这种差异并不重要,而不表现担忧会占主导地位。

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

更新在回答这个问题编辑:

C++库,在一般情况下,没有得到使用魔法来避免同步原语。异步接口和同步接口很可能会包装你将要做的事情。处理必须发生在上下文中,如果完成要发送给另一个上下文,则需要同步原语来完成此操作。

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

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

0

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

根据您的线程库,启动和停止线程也会有相当大的开销。

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

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