您好,登錄后才能下訂單哦!
怎樣進(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í)。
免責(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)容。