现在我想在我的程序中创建三个进程,每个进程中都有几个线程 每个线程都是无限的任务,可能会睡觉并定期被唤醒。此外,这个过程还有一些工作要做 我的问题是:
1)我是否需要将线程设置为分离?如果我将线程设置为分离,它们似乎不会运行!! 但是,如果线程可以连接,那么进程必须等待线程退出并且它不能自己完成工作! 我应该选择哪一个?
2)日程安排政策的范围是什么?我的意思是,如果我将调度策略设置为FIFO,那么所有进程中的所有线程都是由FIFO策略调度的?或者只是这个策略安排了使用此属性设置的线程?
3)线程优先级的范围是什么?线程优先级只在单个进程中有用,而在另一个进程中,存在另一组线程优先级?????而且他们互不感染???
感谢您的帮助!谢谢!
答案 0 :(得分:1)
已分离或已加入:这取决于您需要的类型。
如果您希望主可执行线程(产生新线程)需要继续工作而不需要等待生成的线程返回值,则可以使用DETACH。
如果您需要主可执行线程,只需等待返回值并且不需要自己执行任何其他任务。你可以使用JOIN。
创建线程时,除非在调用pthread_create之前由属性更改,否则它将使用默认调度策略。创建后,您还可以动态更改计划策略。注意:调度策略会影响具有相同优先级的线程。
优先级:您可以使用pthread_setschedparam(也用于调度策略)更改优先级。 但是,在Linux中,线程也是一个轻量级的过程。所以,所有线程都优先考虑整个流程级别, 不在每个过程中。
答案 1 :(得分: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);
答案 2 :(得分:0)
(1)您有编码错误。分离的线程获得与其他所有内容一样的时间片。如果它没有运行那么你正在做的事情。你应该发布你的threadfunc和在另一个问题中创建线程的函数。
在不知道自己在做什么的情况下,无法确定您的线程是可以连接还是分离。可连接线程的主要好处是,您知道它们何时完成,您可以检查返回数据。如果这些对您来说并不重要,那么将它们连接起来就没有什么优势 - 除了创建它们之外,因为这是默认设置。
如果您不想阻止pthread_join,您可以采取策略。你的线程可以在它们死之前设置开关,你可以使用条件变量,你可以有一个连接死线程的单独线程,等等。同样,我们无法知道您的特定案例的最佳策略是什么。
(2& 3)线程继承了创建它的线程的调度策略和优先级,除非您专门更改它们,否则它们将保持这种状态。一个进程中线程的策略/优先级与任何其他进程都没有直接关系。