【问题标题】:How to set the attributes of threads in Linux?如何在Linux中设置线程的属性?
【发布时间】:2012-03-10 01:42:59
【问题描述】:

现在我想在我的程序中创建三个进程,每个进程中有几个线程。
并且每个线程都是无限的任务,可以周期性的休眠和唤醒。此外,该过程还有一些任务要做。
我的问题是:

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

2) 日程安排政策的范围是什么?我的意思是,如果我将调度策略设置为 FIFO,那么所有进程中的所有线程都由 FIFO 策略调度?或者只是用这个属性设置的线程是由这个策略调度的?

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

感谢您的帮助!谢谢!

【问题讨论】:

    标签: c linux pthreads


    【解决方案1】:

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

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

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

    当一个线程被创建时,它使用默认的调度策略,除非被属性改变,然后调用pthread_create。同样在创建后,您可以动态更改调度策略。注意:调度策略会影响具有相同优先级的线程。

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

    【讨论】:

    • 你的意思是整个节目只有一个调度策略吗?并且所有线程,无论在哪个进程,在整个程序中都以相同的优先级重新分级?
    • 优先级和调度在线程级别设置。将每个线程视为本身的进程。如果进程 P1 有 sched 策略 Sched1 和 Sched2 的 Th1,Th2 线程。进程 P2 的线程 Th3、Th4 分别具有 sched 策略 Sched1、Sched2。因此操作系统使用 Sched1 机制调度 Th1、Th3,而 Th2、Th4 使用 Sched2 机制(假设线程具有相同的优先级)。同样,如果 P1 有 5 个 Pr1 线程和另外 3 个 Pr2 线程。如果 P2 有 Pr1 的 2 个 threds。 P1(5 threds)+P2(2 个线程),每个线程将获得 OS 优先级的 1/7 时间片(假设相同的调度策略)。
    【解决方案2】:

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

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

    如果您不想在 pthread_join 中阻塞,您可以采用一些策略。你的线程可以在死前设置开关,你可以使用条件变量,你可以有一个单独的线程来连接死线程等等。同样,不可能知道什么是您的特定案例的最佳策略。

    (2 & 3) 线程继承创建它的线程的调度策略和优先级,除非您特别更改它们,否则它们将保持这种状态。一个进程中线程的策略/优先级与任何其他进程没有直接关系。

    【讨论】:

      【解决方案3】:

      我只回答第一个问题:

      无需将线程创建为分离的,因为您可以在主进程结束时简单地加入它们。

      要将线程创建为分离的,您应该首先创建一个属性,然后将其用作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);
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-01-23
        • 2013-08-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-08-09
        相关资源
        最近更新 更多