首次使用C用户。我一直在学习创建基本的C程序,而我的教授给了我们第一个重要的任务,我绝望地失去了。
对于其中的一部分,我应该创建三个不同的线程,SCHED_OTHER
,SCHED_RR
和SCHED_FIFO
作为各自的调度优先级。
这三个线程中的每一个都将等待“主”线程发出信号,告知它们应该开始运行“任务”。
此任务是一个带有非屈服和非阻塞指令的函数调用,需要5到10秒才能完成。
基本上,有两个问题:
如何在C中创建具有已定义优先级(SCHED_OTHER
,SCHED_RR
或SCHED_FIFO
)的线程(如何使用pthread_create()
?)
我将如何编写这些任务? (伪代码很好)
答案 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系统最新且维护良好的核心手册页源。