【发布时间】:2013-02-09 11:11:25
【问题描述】:
在使用 C 语言编程时,在 Linux shell 中,我试图减少线程开销,基本上是降低 CPU 时间(并提高效率)。
现在在程序中创建了许多线程,需要在它终止之前完成一项工作。由于互斥,只有一个线程可以同时完成工作。
我知道一个线程在开始之前完成一项工作需要多长时间
当有线程执行该工作时,其他线程必须等待。他们检查是否可以完成工作的方式是是否满足条件变量。
对于等待线程,如果他们使用那个条件变量等待,使用这个特定的代码等待(a、b、c 和 d 只是任意的东西,这只是一个例子):
while (a == b || c != d){
pthread_cond_wait(&open, &mylock);
}
这效率如何? pthread_cond_wait 代码中发生了什么?是一个不断检查条件变量的while循环(在幕后)吗?
另外,既然我知道一个线程将花费多长时间,那么我首先执行关于最短作业的调度策略是否更有效?或者这无关紧要,因为在执行这项工作的任何线程组合中,程序将花费相同的时间来完成。换句话说,是否首先使用最短作业会降低其他线程等待的 CPU 开销?因为最短的工作首先似乎可以缩短等待时间。
【问题讨论】:
-
您能否重写您的问题以使其更清楚?另外,您想知道不使用互斥锁而只是手动安排内容吗?
-
您需要阅读操作系统教科书。 Condvars 和其他同步机制不是 while() 循环,高效的多线程设计非常努力地避免同步,或者,如果不可避免,最小化它的跨度。您正在尝试运行 b4 walk。
-
好的,我试图让它更清楚(我编辑了上面的问题)。所以基本上我要问的是,如果我使用调度策略首先做最短的工作,那么这应该最大限度地减少没有完成工作的线程的等待时间。正因为如此,这是否意味着总的等待时间减少了,从而减少了整体 cpu 时间?由于任何形式的等待仍然会占用一些 CPU 时间,对吧?
-
注意我的编辑以详细回答这个问题。
标签: c linux multithreading synchronization mutex