我一直致力于艰巨的任务,需要大量的研究,而且我已经走到了尽头。我一直在阅读linux的手册页,但我很难吸收那里的任何信息。这是我在C编程的第三周。
我设法创建了一个新线程,并将其调度优先级设置为SCHED_FIFO。在我的程序中,我创建它,告诉它等待两秒钟,然后一旦完成我尝试打印出我给它的优先级(所以基本上,我希望它打印出来" policy = SCHED_FIFO& #34)。我也必须为SCHED_OTHER做这件事,但是一旦我理解了这一点,我就应该很容易做到这一点。
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <pthread.h>
void *FIFORunner(void *vargp, pthread_t thread);
int main(){
pthread_t myThread;
printf("Before Thread\n\n");
pthread_create(&myThread, NULL, FIFORunner, NULL);
pthread_join(myThread, NULL);
printf("After Thread\n");
return 0;
}
void *FIFORunner(void *vargp, pthread_t myThread){
int s, policy;
struct sched_param param;
pthread_setschedparam(&myThread, SCHED_FIFO, ¶m);
sleep(2);
s = pthread_getschedparam(myThread, &policy, ¶m);
printf("policy = %d\n", policy);
return NULL;
}
所以我的代码,没什么特别的。每当我运行它时,它会打印出一个看似随机的整数,例如:policy = 1464624896,policy = -1630095616,policy = 1487660800。
如何让pthread_getschedparam()工作?我传递了错误的东西吗?
答案 0 :(得分:-1)
以下提议的代码:
priority
和/或scheduling
级别。void *(*start_routine) (void *)
请注意,只有一个参数,而不是两个参数。因此,OPs发布的代码无法编译。 (这不是唯一的原因)myThread
是函数main()
中的局部变量,因此在main()范围之外不可见。结果是发布的代码无法编译。(void)vargp;
pthread_setschedparam(&myThread, SCHED_FIFO, ¶m);
和s = pthread_getschedparam(myThread, &policy, ¶m);
,应检查返回的值(== 0)以确保操作成功。如果不成功,请调用perror()
输出随附的文本以及系统认为操作失败的原因。return NULL;
这将“有效”,但是,保留在pthread
函数系列中的等效语句将是:pthread_exit( NULL );
现在,建议的代码:
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <pthread.h>
void *FIFORunner( void *vargp );
int main( void )
{
pthread_t myThread;
printf("Before Thread\n\n");
// any priority and/or scheduling changes should be
// applied via the second parameter to 'pthread_create()'
pthread_create( &myThread, NULL, FIFORunner, NULL);
printf( "in main: myThread = %d\n", (int)myThread );
pthread_join( myThread, NULL );
printf("After Thread\n");
return 0;
}
void *FIFORunner( void *vargp )
{
(void)vargp;
pthread_t myThread = pthread_self();
int policy = SCHED_OTHER; // any higher policy will cause 'pthread_setschedparam()` to fail.
struct sched_param param;
param.sched_priority = 0; // any higher priority will cause 'pthread_setschedparam()` to fail.
printf( "in Thread: myThread = %d\n", (int)myThread );
if( pthread_setschedparam( myThread, policy, ¶m ) )
{
perror( "pthread_setschedparm failed" );
pthread_exit( NULL );
}
sleep(2);
if( pthread_getschedparam( myThread, &policy, ¶m ) )
{
perror( "pthread_getschedparam failed" );
pthread_exit( NULL );
}
printf( "policy = %d\n", policy );
pthread_exit( NULL );
}