溫馨提示×

溫馨提示×

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

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

怎樣進行基于linuxthreads2.0.1線程源碼分析attr.c

發布時間:2021-12-09 09:41:05 來源:億速云 閱讀:166 作者:柒染 欄目:大數據

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

attr.c是線程屬性管理的實現。因為linuxthreads是通過創建一個進程的方式實現線程的,所以屬性中支持設置調度的優先級,調度策略等(參考操作系統的實現)。該文件沒有太多內容。具體作用在分析其他文件的時候再作分析。

 
    


#include <unistd.h>
#include "pthread.h"
#include "internals.h"
// 初始化線程屬性結構體
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;
}
// 設置detach狀態
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;
}
// 設置調度優先級的屬性
int pthread_attr_setschedparam(pthread_attr_t *attr,
                              const struct sched_param *param)
{
 // 由系統提供的最大和最小優先級
 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是分時調度,設置成非分時調度需要是超級用戶
 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;
}
// 調度策略來源于繼承還是顯示設置的
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;
}
// 優先級的有效范圍,PTHREAD_SCOPE_SYSTEM是和系統所有線程競爭,否則是和本進程內的其他線程競爭
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;
}    

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

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

亚洲午夜精品一区二区_中文无码日韩欧免_久久香蕉精品视频_欧美主播一区二区三区美女