gpt4 book ai didi

c - Pthread - 设置调度程序参数

转载 作者:太空宇宙 更新时间:2023-11-04 11:31:40 26 4
gpt4 key购买 nike

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

If the Thread Execution Scheduling option is supported, and the threads involved in the lock are executing with the scheduling policies SCHED_FIFO or SCHED_RR, the calling thread shall not acquire the lock if a writer holds the lock or if writers of higher or equal priority are blocked on the lock; otherwise, the calling thread shall acquire the lock.

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

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,请问这是为什么?

最佳答案

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

(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) 获取 OS threadID。 pthread__setschedparam 需要 pthreads 线程 id,这是不同的。 pthreads 线程 ID 由数据类型 pthread_t 中的 pthread_createpthread_self 返回。更改 pthread__setschedparam 以使用此类型和适当的值,看看情况是否有所改善。

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

关于c - Pthread - 设置调度程序参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10956459/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com