2013-02-24 52 views
2

当使用线程在C编程时,在Linux shell中,我试图减少线程开销,基本上降低CPU时间(并使其更有效)。线程开销性能

现在在程序中,很多线程正在创建,需要在终止之前完成一项工作。由于相互排斥,只有一个线程可以同时完成这项工作。

我知道它开始前

其他线程必须等待有一个线程做这项工作线程需要多长时间才能完成的工作。他们检查他们是否可以完成这项工作的方式是如果满足一个条件变量。

对于等待的线程,如果它们等待使用条件变量,使用该特定的代码来等待(在A,B,c和d是只是任意的东西,这仅仅是一个例子):

while (a == b || c != d){ 
    pthread_cond_wait(&open, &mylock); 
} 

这个效率如何? pthread_cond_wait代码中发生了什么?它是否是一个持续检查条件变量的while循环(幕后)?

此外,由于我知道线程需要多长时间工作,因此我首先强制执行有关最短作业的调度策略,这会更有效吗?或者这并不重要,因为在执行这项工作的任何线程组合中,程序将花费相同的时间完成。换句话说,是否使用最短的工作首先降低了CPU等待的其他线程的CPU开销?由于最短的工作首先似乎减少了等待时间。

+0

你可以重写你的问题,使之clearar?此外,你想知道不使用互斥体,只是手动调节的东西? – speeder 2013-02-24 02:00:58

+1

您需要阅读操作系统教科书。 Condvars和其他同步机制不是while()循环,高效的多线程设计非常难以避免同步,或者如果不可避免的话,尽量减少它的跨度。您正在尝试运行b4步行。 – 2013-02-24 02:01:23

+0

好吧我试图让它更清晰(我编辑了上面的问题)。所以基本上我问的是,如果我使用调度策略先做最短的工作,那么应该尽量减少没有完成工作的线程的等待时间。正因为如此,这是否意味着整体CPU时间减少,因为总的等待时间缩短了?由于任何类型的等待仍然会使用一定数量的CPU时间吗? – omega 2013-02-24 02:07:33

回答

4

用单个线程解决您的问题,然后向我们寻求帮助,确定揭示并行化的最佳位置,如果您尚未看到需要最少锁定的途径。要使用的最佳线程数取决于您使用的计算机。使用多于n + 1个线程没有什么意义,其中n是程序可用的处理器/内核的数量。为了减少线程创建的开销,给每个线程多个任务是个好主意。

以下是响应你的澄清编辑:在节目中大量的线程正在创建并需要在终止前做了 工作

现在。由于相互排斥,只有一个线程可以在相同的 时间完成这项工作。

否。如上所述,最多应创建n + 1个线程。互斥是什么意思?我认为互斥是“只有一个线程在其工作队列中包含任务x”。这意味着没有其他线程需要锁定任务x。

其他线程必须等待有线程完成该任务。他们检查他们是否可以完成这项工作的方式是 是否符合条件变量 。

给每个线程一个独立的任务列表来完成。如果作业x是作业y的先决条件,那么作业x和作业y理想地位于同一个列表中,以便该线程不必处理任何作业上的线程互斥对象。你有没有探索过这条大道?

while(a == b || c!= d){ pthread_cond_wait(& open,& mylock); } 这个效率如何? pthread_cond_wait代码中发生了什么? 是否经常检查 条件变量的while循环(幕后)?

为了避免不确定的行为,mylock必须由当前线程调用调用pthread_cond_wait之前锁定的,所以我相信你的代码的pthread_mutex_lock调用进入这个循环之前获取mylock锁。

  1. 块的pthread_mutex_lock线程,直到它获得锁,这意味着每次一个线程可以调用pthread_mutex_lock和调用pthread_cond_wait(在调用pthread_cond_wait预编码)之间执行的代码。
  2. pthread_cond_wait释放锁,允许其他线程在pthread_mutex_lock和pthread_cond_wait之间运行代码。在pthread_cond_wait返回之前,它会等待,直到它再次获得锁定。重复此步骤adhoc while (a == b || c != d)
  3. pthread_mutex_unlock稍后在任务完成时调用。在此之前,一次只有一个线程可以执行pthread_cond_wait和pthread_mutex_unlock(post-pthread_cond_wait代码)之间的代码。另外,如果一个线程正在运行pre-pthread_cond_wait代码,那么没有其他线程可以运行post-pthread_cond_wait代码,反之亦然。

因此,您可能会运行存储作业的单线程代码在优先级队列中。至少你不会有不必要和过度的上下文切换。正如我刚才所说,“用单一线程解决你的问题”。您无法对优化节省多少时间做出有意义的陈述,直到您有所需衡量为止。

而且,因为我知道一个线程工作多长时间,是不是更 高效的,我第一次执行调度策略有关最短工作 ?或者这并不重要,因为在完成这项工作的线程的任何组合中,程序将花费相同的时间完成 。换句话说,是否使用最短作业首先降低CPU 开销,以供其他线程进行等待?由于最短的工作 首先似乎较低的等待时间。

如果您要执行调度策略,请在单线程项目中执行。如果您认为并发性将帮助您快速解决你的问题,然后暴露你完成单线程的项目,并发性,并得出测试来验证你的信念。我建议以线程不必共享工作的方式公开并发性。

2

Pthread的基元一般是相当有效的;阻塞的东西在阻塞时通常不消耗CPU时间或忽略不计。如果您遇到性能问题,请首先查看其他位置。

不要担心调度策略。如果您的应用程序设计为一次只能运行一个线程,那么您就失去了首先进行线程处理所带来的所有成本的大部分好处。 (如果你不是强加的一切费用,如锁定共享的变量,因为只有一个线程在运行的时间,你是在自找麻烦的道路。)