溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

怎樣進(jìn)行基于linuxthreads2.0.1線程源碼分析attr.c

發(fā)布時(shí)間:2021-12-09 09:41:05 來源:億速云 閱讀:121 作者:柒染 欄目:大數(shù)據(jù)

怎樣進(jìn)行基于linuxthreads2.0.1線程源碼分析attr.c,針對(duì)這個(gè)問題,這篇文章詳細(xì)介紹了相對(duì)應(yīng)的分析和解答,希望可以幫助更多想解決這個(gè)問題的小伙伴找到更簡(jiǎn)單易行的方法。

attr.c是線程屬性管理的實(shí)現(xiàn)。因?yàn)閘inuxthreads是通過創(chuàng)建一個(gè)進(jìn)程的方式實(shí)現(xiàn)線程的,所以屬性中支持設(shè)置調(diào)度的優(yōu)先級(jí),調(diào)度策略等(參考操作系統(tǒng)的實(shí)現(xiàn))。該文件沒有太多內(nèi)容。具體作用在分析其他文件的時(shí)候再作分析。

 
    


#include <unistd.h>
#include "pthread.h"
#include "internals.h"
// 初始化線程屬性結(jié)構(gòu)體
int pthread_attr_init(pthread_attr_t *attr)
{
 attr->detachstate = PTHREAD_CREATE_JOINABLE;
 attr->schedpolicy = SCHED_OTHER;
 attr->schedparam.sched_priority = 0;
 attr->inheritsched = PTHREAD_EXPLICIT_SCHED;
 attr->scope = PTHREAD_SCOPE_SYSTEM;
 return 0;
}

int pthread_attr_destroy(pthread_attr_t *attr)
{
 return 0;
}
// 設(shè)置detach狀態(tài)
int pthread_attr_setdetachstate(pthread_attr_t *attr, int detachstate)
{
 if (detachstate < PTHREAD_CREATE_JOINABLE ||
     detachstate > PTHREAD_CREATE_DETACHED)
   return EINVAL;
 attr->detachstate = detachstate;
 return 0;
}

int pthread_attr_getdetachstate(const pthread_attr_t *attr, int *detachstate)
{
 *detachstate = attr->detachstate;
 return 0;
}
// 設(shè)置調(diào)度優(yōu)先級(jí)的屬性
int pthread_attr_setschedparam(pthread_attr_t *attr,
                              const struct sched_param *param)
{
 // 由系統(tǒng)提供的最大和最小優(yōu)先級(jí)
 int max_prio = sched_get_priority_max(attr->schedpolicy);
 int min_prio = sched_get_priority_min(attr->schedpolicy);

 if (param->sched_priority < min_prio || param->sched_priority > max_prio)
   return EINVAL;
 attr->schedparam = *param;
 return 0;
}

int pthread_attr_getschedparam(const pthread_attr_t *attr,
                              struct sched_param *param)
{
 *param = attr->schedparam;
 return 0;
}

int pthread_attr_setschedpolicy(pthread_attr_t *attr, int policy)
{
 if (policy != SCHED_OTHER && policy != SCHED_FIFO && policy != SCHED_RR)
   return EINVAL;
 // SCHED_OTHER是分時(shí)調(diào)度,設(shè)置成非分時(shí)調(diào)度需要是超級(jí)用戶
 if (policy != SCHED_OTHER && geteuid() != 0)
   return ENOTSUP;
 attr->schedpolicy = policy;
 return 0;
}

int pthread_attr_getschedpolicy(const pthread_attr_t *attr, int *policy)
{
 *policy = attr->schedpolicy;
 return 0;
}
// 調(diào)度策略來源于繼承還是顯示設(shè)置的
int pthread_attr_setinheritsched(pthread_attr_t *attr, int inherit)
{
 if (inherit != PTHREAD_INHERIT_SCHED && inherit != PTHREAD_EXPLICIT_SCHED)
   return EINVAL;
 attr->inheritsched = inherit;
 return 0;
}

int pthread_attr_getinheritsched(const pthread_attr_t *attr, int *inherit)
{
 *inherit = attr->inheritsched;
 return 0;
}
// 優(yōu)先級(jí)的有效范圍,PTHREAD_SCOPE_SYSTEM是和系統(tǒng)所有線程競(jìng)爭(zhēng),否則是和本進(jìn)程內(nèi)的其他線程競(jìng)爭(zhēng)
int pthread_attr_setscope(pthread_attr_t *attr, int scope)
{
 switch (scope) {
 case PTHREAD_SCOPE_SYSTEM:
   attr->scope = scope;
   return 0;
 case PTHREAD_SCOPE_PROCESS:
   return ENOTSUP;
 default:
   return EINVAL;
 }
}

int pthread_attr_getscope(const pthread_attr_t *attr, int *scope)
{
 *scope = attr->scope;
 return 0;
}    

關(guān)于怎樣進(jìn)行基于linuxthreads2.0.1線程源碼分析attr.c問題的解答就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,如果你還有很多疑惑沒有解開,可以關(guān)注億速云行業(yè)資訊頻道了解更多相關(guān)知識(shí)。

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI