创建具有不同调度优先级的线程

时间:2018-01-29 01:33:01

标签: c linux multithreading scheduling

首次使用C用户。我一直在学习创建基本的C程序,而我的教授给了我们第一个重要的任务,我绝望地失去了。

对于其中的一部分,我应该创建三个不同的线程,SCHED_OTHERSCHED_RRSCHED_FIFO作为各自的调度优先级。 这三个线程中的每一个都将等待“主”线程发出信号,告知它们应该开始运行“任务”。

此任务是一个带有非屈服和非阻塞指令的函数调用,需要5到10秒才能完成。

基本上,有两个问题:

  • 如何在C中创建具有已定义优先级(SCHED_OTHERSCHED_RRSCHED_FIFO)的线程(如何使用pthread_create()?)

  • 我将如何编写这些任务? (伪代码很好)

1 个答案:

答案 0 :(得分:2)

  

如何在C中创建具有已定义优先级的线程(SCHED_OTHER,SCHED_RR或SCHED_FIFO)(如何使用pthread_create()?)(伪代码很好)

最后一点,“伪代码很好”是重要的一点。你应该考虑在问题的早期移动它,因为即使我认为这是一次钓鱼探险,让我有人为你做功课,在我看到之前。

当你创建一个新的POSIX线程时,你告诉pthread_create()函数新线程应该运行哪个函数。当线程从该函数返回或使用pthread_exit()退出时,它将停止执行。通常,另一个线程通过pthread_join()获取它,它也可以提供线程函数的返回值(指针)。

线程函数将void指针(void *)作为参数,并返回一个。通常也不需要。如果要传递整数值,可以使用(void *)(intptr_t)value(void *)(uintptr_t)value将有符号或无符号value强制转换为指针;和(intptr_t)ptr(uintptr_t)ptr将指针ptr强制转换为有符号或无符号整数类型。这些类型在POSIX中的<stdint.h>中指定。

您还可以提供一组属性作为C库的规范,以了解创建的线程应具有哪种属性。在创建过程中不会消耗这些属性,您可以使用同一组属性来创建任意数量的线程。普通变量可以保存属性;您不需要为它动态分配内存。与线程属性最常见的事情是将堆栈大小设置为一个合理的值,因为默认堆栈大小往往很大(类似于8兆字节),这通常是进程尝试创建一个时遇到的第一个限制大量的线程。

因此,要创建三个线程,每个线程都有一个特定的调度程序策略,您可以:

Initialize a set of pthread attributes,
    using pthread_attr_init()

Set the scheduler policy attribute,
    using pthread_attr_setschedpolicy()
Create the thread using pthread_create(),
    but do remember to check for errors

Set the scheduler policy attribute,
    using pthread_attr_setschedpolicy()
Create the thread using pthread_create(),
    but do remember to check for errors

Set the scheduler policy attribute,
    using pthread_attr_setschedpolicy()
Create the thread using pthread_create(),
    but do remember to check for errors

Discard the thread attributes,
    using pthread_attr_destroy()

The main/initial thread is free to twiddle
its proverbial thumbs here.

Wait for each of the three threads to exit
    using three calls to pthread_join()

Done.

您可能还希望在设置调度程序策略属性时(以及设置调度程序优先级时)检查错误,因为并非所有非策略用户都允许使用所有策略和优先级。我希望你有很多

retcode = ... pthreads-related function call ...;
if (retcode) {
    fprintf(stderr, "pthread_suchandsuch() failed: %s.\n", strerror(retcode));
    exit(EXIT_FAILURE);
}
你的代码中的

。它可能看起来很冗长,但是当你找到原因不起作用的原因时它会非常有用。 (另外,使用gcc -Wall -O2 -pthread sources.. -o binary编译程序。)

我热烈建议您将浏览器窗口保持为Linux man pages online,这是Linux和POSIXy系统最新且维护良好的核心手册页源。