2012-03-10 36 views
1

现在我想在我的程序中创建三个进程,每个进程中都有几个线程。
而每个线程都是无限的任务,可能会睡眠并定期被唤醒。此外,这个过程还有一些任务要做。
我的问题是:如何在Linux中设置线程的属性?

1)我是否需要将线程设置为分离?如果我将线程设置为分离,它们似乎不会运行! 但是,如果线程为可连接的,则进程必须等待线程退出并且它不能完成它自己的工作! 哪一个我应该选择?

2)调度策略的范围是什么?我的意思是,如果我将调度策略设置为FIFO,则所有进程中的所有线程都由FIFO策略调度?或者只是使用此策略设置的线程按此策略进行安排?

3)线程优先级的范围是什么?线程优先级在单个进程中很有用,而在另一个进程中,存在另一组线程优先级。而且它们不会互相感染?

我将不胜感激您的帮助!谢谢!

回答

0

(1)您有一个编码错误。分离的线程像其他事物一样获得时间片。如果它没有运行,那么这是你正在做的事情。你应该发布你的threadfunc和在另一个问题中创建线程的函数。

不可能说你的线程在不知道你在做什么时应该可以连接或分离。可连接线程的主要好处是你知道它们何时完成,你可以检查返回数据。如果这些对你来说并不重要,那么使它们可联结并没有真正的优势 - 除了创建它们稍微容易些,因为这是默认设置。

如果你不想在pthread_join中阻塞,你可以追求策略。你的线程可以在开关死前设置开关,你可以使用条件变量,你可以有一个单独的线程来连接死线等等。再次,不可能知道什么是您的特定情况的最佳策略。 3)一个线程会继承创建它的线程的调度策略和优先级,并且它们保持这种方式,除非您专门更改它们。一个进程中的线程策略/优先级与任何其他进程都没有直接关系。

+0

令人印象深刻的答案!!!非常有用!谢谢! – city 2012-03-10 04:03:39

0

我只回答的第一个问题:

无需创建线程沾边,因为你可以简单地在主过程结束加入他们的行列。

创建线程沾边,你应该先创建一个属性,然后把它作为一个参数pthread_create

pthread_t thread1; 
pthread_attr_t attr; 

int chk; 

chk = pthread_attr_init(&attr); 
printf("attr_init: %d\n",chk); 

chk = pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED); 
printf("attr_setdetachstate: %d\n",chk); 

chk = pthread_create(&thread1, &attr, function, NULL); 
+0

谢谢你的回答。 – city 2012-03-10 03:58:42

1

分离或连接:这取决于您需要的需求类型。

如果您希望主执行线程(它产生新线程)需要继续工作,并且不需要等待生成的线程返回值,则可以使用DETACH。

如果您需要主执行线程,只需等待返回值并且不需要自行执行任何其他任务。您可以使用JOIN。

创建线程时,它会在调用pthread_create之前使用默认的调度策略,除非通过属性进行更改。同样在创建之后,您可以动态更改调度策略。注:调度策略会影响具有相同优先级的线程。

优先级:您可以使用pthread_setschedparam(也用于调度策略)更改优先级。 但是,在Linux线程中也是一个轻量级的过程。所以,所有线程都优先考虑整个进程级别,而不是在每个进程内。

+0

你的意思是整个程序只有一个时间表策略?而且,无论在哪个过程中,所有的线程在整个程序中都被重新归类为同一组优先级? – city 2012-03-10 05:51:12

+0

优先级和调度在线程级别设置。将每个线程看作是进程本身。如果进程P1具有调度策略Sched1和Sched2的Th1,Th2线程。进程P2具有线程Th3,Th4分别具有调度策略Sched1,Sched2。因此,操作系统使用Sched1机制和Th2,Th4使用Sched2机制(假设线程具有相同的优先级)来调度Th1,Th3。同样,如果P1有5个Pr1线程和另外3个Pr2线程。如果P2有2个Pr1。 P1(5 threds)+ P2(2个线程),每个线程将获得OS的1/7时间片(假设调度策略相同)。 – vamsi 2012-03-10 06:17:25