C Pthread-设置调度程序参数

C Pthread-设置调度程序参数,c,linux,pthreads,C,Linux,Pthreads,我希望以某种方式使用pthread库中的读写器锁,即写器优先于读器。我在手册上读到 如果支持线程执行调度选项,并且锁中涉及的线程正在使用调度策略SCHED_FIFO或SCHED_RR执行,则如果写入程序持有锁,或者如果锁上阻塞了优先级更高或同等的写入程序,则调用线程不应获取锁;否则,调用线程将获取锁 所以我编写了一个小函数来设置线程调度选项 void thread_set_up(int _thread) { struct sched_param *_param=malloc(sizeof (s

我希望以某种方式使用pthread库中的读写器锁,即写器优先于读器。我在手册上读到

如果支持线程执行调度选项,并且锁中涉及的线程正在使用调度策略SCHED_FIFO或SCHED_RR执行,则如果写入程序持有锁,或者如果锁上阻塞了优先级更高或同等的写入程序,则调用线程不应获取锁;否则,调用线程将获取锁

所以我编写了一个小函数来设置线程调度选项

void thread_set_up(int _thread)
{
 struct sched_param *_param=malloc(sizeof (struct sched_param));
 int *c=malloc(sizeof(int));
 *c=sched_get_priority_min(SCHED_FIFO)+1;
 _param->__sched_priority=*c;
 long *a=malloc(sizeof(long));
 *a=syscall(SYS_gettid);
 int *b=malloc(sizeof(int));
 *b=SCHED_FIFO;
 if (pthread_setschedparam(*a,*b,_param) == -1)
 {
    //depending on which thread calls this functions, few thing can happen
    if (_thread == MAIN_THREAD)
        client_cleanup();
    else if (_thread==ACCEPT_THREAD)
    {
        pthread_kill(params.main_thread_id,SIGINT);
        pthread_exit(NULL);
    }
}
}


很抱歉那些
a、b、c
但是我尝试了
malloc
一切,但我还是在打电话给
pthread\u setschedparam
时得到了
SIGSEGV
,我想知道为什么?

我不知道这些是否是您问题的确切原因,但它们应该能帮助您解决问题

(1)
pthread_setschedparam
成功返回0,否则返回正数。所以

if (pthread_setschedparam(*a,*b,_param) == -1) 
永远不会执行。应该是这样的:

if ((ret = pthread_setschedparam(*a, *b, _param)) != 0)
{ //yada yada 
}
顺便说一句,您正在做什么还不是100%清楚,但是
pthread\u kill
看起来是一种尽可能丑陋的方法

(2)
syscall(SYS\u getId)
获取操作系统线程ID
pthread_uusetschedparam
需要pthreads线程id,这是不同的。pthreads线程id由数据类型
pthread\u t
中的
pthread\u create
pthread\u self
返回。更改
pthread\uuu setschedparam
以使用此类型和正确的值,然后查看情况是否有所改善


(3) 您需要以priviledge用户身份运行才能更改计划。尝试以root或sudo或其他任何形式运行程序。

1。pthread_kill是通知主线程另一个线程遇到致命错误,我重写了sigint的信号处理程序来执行cleanup2。关于syscall和pthread_self,您是对的,我将传递参数更改为pthread_self,它可以工作3。您也在这里。我非常感谢你的帮助。