0

我想以某种方式使用 pthread 库中的读写器锁,即作者优先于读者。我在手册页中读到

如果支持 Thread Execution Scheduling 选项,并且锁中涉及的线程正在使用调度策略 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一切,我仍然SIGSEGV接到电话pthread_setschedparam,我想知道为什么?

4

1 回答 1

1

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

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

if (pthread_setschedparam(*a,*b,_param) == -1) 

永远不会执行。它应该是这样的:

if ((ret = pthread_setschedparam(*a, *b, _param)) != 0)
{ //yada yada 
}

顺便说一句,并不是 100% 清楚你在做什么,但pthread_kill看起来尽可能丑陋。

(2)syscall(SYS_gettid)获取操作系统threadID。 pthread__setschedparam期望pthreads 线程 id,这是不同的。pthreads 线程 id 由 datatype 返回pthread_createpthread_self在其中返回pthread_t。更改pthread__setschedparam为使用此类型和适当的值,看看情况是否有所改善。

(3) 您需要以特权用户身份运行才能更改时间表。尝试以 root 或 sudo 或其他方式运行该程序。

于 2012-06-09T00:11:18.407 回答