2011-12-15 72 views
3

由于链不会同时执行,链与单线之间的性能有什么区别?而且,为了保护post函数的处理程序中的共享数据,不需要锁,对吗?增强链与单线程

假设应用程序执行几个作业,下面是一些示例代码。

strand.post(boost::bind(&onJob, this, job1)); 

void onJob(tJobType oType) 
{ 
    if (oType == job1) 
    // do something 
    else if(oType == job2) 
    // do something 
} 

编辑:我尝试测量从发布和调用onJob的延迟是相当高的。我想知道是否有任何方法可以减少它

+0

你能提供一些上下文来解决这个问题吗?你用这些股来做什么? – 2011-12-15 07:10:23

+0

你从哪里找到Boost.Strand?此外,你的问题究竟是什么? – 2011-12-15 07:12:30

回答

11

A strand通常会比单线程执行得更好。这是因为一个链让调度器和程序逻辑更加灵活。然而,这些差异通常并不显着(除了我在下面讨论的特例)。

例如,考虑发生需要服务的情况。对于一个链,可能有多个线程可以执行该服务,并且首先安排这些线程中的哪一个将执行该工作。通过一个线程,该线程必须按计划开始工作。

例如,假设一个定时器触发了一个新的工作来完成这个链。如果定时器线程调用了该线程的调度例程,则定时器线程可以在没有上下文切换的情况下完成工作。如果你有专用的线程而不是线程,那么定时器线程就无法完成工作,并且在定时器例程创建的工作甚至可能开始之前就需要上下文切换。

请注意,如果您只有一个线程执行链,您不会获得这些好处。 (但是,国际海事组织,如果你关心的是性能,这是一种愚蠢的做法。)

对于某些应用程序,仔细将程序分解为股线可以显着减少所需的锁定操作量。只能在一条链中访问的对象不需要被锁定。但是你仍然可以获得多线程的很多优点。 (但有一个很大的缺点 - 如果你的代码中有任何一个代码块会阻塞整个链,那么你不必介意链是否停顿或者确保你的代码不会阻塞关键链。)

在这种情况下,您可以有三条股,A,B和C,一条线可以为股A做一些工作,一些用于股B,一些用于股C,不用上下文切换高速缓存中的数据很热)。每个任务使用一个线程需要两个上下文切换来完成相同的工作,而每个任务都可能无法在高速缓存中找到数据。如果你不断地“把东西”从一条线转移到另一条线上,股线可以明显胜过专用线。

至于你的第二个问题,除非在一个线程中访问数据,而可能在另一个线程中修改数据,否则不需要锁定。如果对一个对象的所有访问都通过一个单独的链,那么不需要锁,因为一个链只能在一个线程中一次执行。通常情况下,股会访问一些数据,这些数据只能被该股所访问,而另一些数据则会与其他线程或股线共享。