既然strand不会并发执行,那么strand和单线程在性能上有什么区别?此外,不需要锁来保护 post 函数处理程序中的共享数据,对吗?

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

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

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

编辑:我尝试测量 post 的延迟并且调用 onJob 非常高。我想知道有没有什么办法可以减少

最佳答案

strand 通常比单线程性能更好。这是因为链为调度程序和程序逻辑提供了更大的灵活性。然而,这些差异通常并不显着(除了我在下面讨论的特殊情况)。

例如,考虑发生需要服务的事情的情况。使用链,可以有多个线程可以执行服务,并且这些线程中的任何一个首先被调度将完成这项工作。对于线程,必须为该线程安排好开始作业的时间。

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

请注意,如果您只有一个执行链的线程,您将无法获得这些好处。 (但是,IMO,如果您在意这么好的级别的性能,那是一种愚蠢的做事方式。)

对于某些应用程序,小心地将您的程序分成几条可以显着减少所需的锁操作量。仅在单个链中访问的对象不需要被锁定。但是你仍然可以获得多线程的很多优点。 (虽然有一个很大的缺点——如果你的任何代码阻塞,它就会停止整个链。所以你要么不介意一个链是否停止,要么确保你的关键链的代码永远不会阻塞。)

在这种情况下,您可以拥有三个链,A、B 和 C,一个线程可以为链 A 做一些工作,为链 B 做一些工作,为链 C 做一些工作,没有上下文切换(并且数据在缓存)。为每个任务使用一个线程需要两个上下文切换来完成相同的工作,并且每个任务可能无法在缓存中找到数据。如果您不断地从一根绳子到另一根绳子“处理东西”,绳子的性能会明显优于专用线程。

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

关于c++ - boost 线与单线,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/8516303/

10-12 01:31