由于不会同时执行strand,因此strand和single thread之间的性能差异是什么?而且,锁定对于保护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 :(得分:11)
strand通常比单个线程表现更好。这是因为strand为调度程序和程序逻辑提供了更大的灵活性。但是,差异通常不显着(除了我在下面讨论的特殊情况)。
例如,考虑发生需要服务的事情。使用strand,可以有多个可以执行服务的线程,无论哪个线程首先被调度都可以完成这项工作。使用一个线程,必须安排该线程才能启动作业。
例如,假设一个计时器触发,它会创建一些由链完成的新工作。如果计时器线程调用了strand的调度例程,那么计时器线程可以在没有上下文切换的情况下完成工作。如果您有一个专用线程而不是一个strand,那么计时器线程就无法完成工作,并且在计时器例程创建的工作开始之前就需要进行上下文切换。
请注意,如果您只有一个执行strand的线程,则无法获得这些好处。 (但是,国际海事组织,如果你关心这个优秀水平的表现,这是一种愚蠢的做事方式。)
对于某些应用程序,小心地将程序分成多个部分可以显着减少所需的锁定操作量。不需要锁定仅在单个链中访问的对象。但是你仍然可以获得多线程的许多优点。 (但是一个很大的缺点 - 如果你的任何代码永远阻塞,它将阻止整个链。所以你要么不介意一个链停止或确保你的代码没有关键不断阻挡。)
在这种情况下,你可以有三个链,A,B和C,一个线程可以为链A做一些工作,一些用于链B,一些用于链C而没有上下文切换(和缓存中的数据热。为每个任务使用一个线程需要两个上下文切换来执行相同的工作,并且每个任务可能都不会在缓存中找到数据。如果你经常从一条线到另一条线“交易”,股线可以明显优于专用线。
关于第二个问题,除非在一个线程中访问数据,而在另一个线程中可能正在修改数据,否则不需要锁定。如果对对象的所有访问都是通过单个链,则不需要锁,因为一次只能在一个线程中执行一个链。通常,链将访问仅由该链访问的一些数据,以及与其他线程或链共享的一些数据。