提升链与单线程

Mic*_*l D 3 c++ boost boost-asio

由于链不会同时执行,因此strand和单线程之间的性能差异是什么?而且,锁定不需要保护post函数处理程序中的共享数据,对吗?

假设应用程序性能有几个作业,下面是一些示例代码.

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

void onJob(tJobType oType)
{
  if (oType == job1)
   // do something
  else if(oType == job2)
   // do something
}
Run Code Online (Sandbox Code Playgroud)

编辑:我尝试测量帖子的延迟,并且调用onJob非常高.我想知道是否有任何方法可以减少它

Dav*_*rtz 11

一个通常将执行比单个线程更好.这是因为strand为调度程序和程序逻辑提供了更大的灵活性.但是,差异通常不显着(除了我在下面讨论的特殊情况).

例如,考虑发生需要服务的事情.使用strand,可以有多个可以执行服务的线程,无论哪个线程首先被调度都可以完成这项工作.使用一个线程,必须安排该线程才能启动作业.

例如,假设一个计时器触发,它会创建一些由链完成的新工作.如果计时器线程调用了strand的调度例程,那么计时器线程可以在没有上下文切换的情况下完成工作.如果您有一个专用线程而不是一个strand,那么计时器线程无法完成工作,并且在计时器例程创建的工作甚至可以开始之前需要进行上下文切换.

请注意,如果您只有一个执行strand的线程,则不会获得这些好处.(但是,国际海事组织,如果你关心这个优秀水平的表现,这是一种愚蠢的做事方式.)

对于某些应用程序,小心地将程序分成多个部分可以显着减少所需的锁定操作量.不需要锁定仅在单个链中访问的对象.但是你仍然可以获得多线程的许多优点.(一个大缺点,但-如果你的任何代码的永远.块,它会拖延整个链所以,你要么必须不介意一个摊位链或确保没有代码的一个关键链不断块.)

在这种情况下,你可以有三个链,A,B和C,一个线程可以为链A做一些工作,一些用于链B,一些用于链C而没有上下文切换(并且数据很热)缓存).为每个任务使用一个线程需要两个上下文切换来执行相同的工作,并且每个任务可能都不会在缓存中找到数据.如果你经常从一条线到另一条线"交易",股线可以明显优于专用线.

至于你的第二个问题,除非在一个线程中访问数据,而在另一个线程中可能正在修改数据,否则不需要锁定.如果对对象的所有访问都是通过单个链,则不需要锁,因为一次只能在一个线程中执行一个链.通常,链将访问仅由该链访问的一些数据以及与其他线程或链共享的一些数据.