考慮到下面的一段代碼,我想知道在linux下假設pthreads或甚至是使用Boost.Thread API的代碼的等價位是什麼。Linux上的SetThreadPriority的等效性(pthreads)
#include <windows.h>
int main()
{
SetThreadPriority(GetCurrentThread(),THREAD_PRIORITY_HIGHEST);
return 0;
}
考慮到下面的一段代碼,我想知道在linux下假設pthreads或甚至是使用Boost.Thread API的代碼的等價位是什麼。Linux上的SetThreadPriority的等效性(pthreads)
#include <windows.h>
int main()
{
SetThreadPriority(GetCurrentThread(),THREAD_PRIORITY_HIGHEST);
return 0;
}
在linux中相當於SetThreadPriority
將是pthread_setschedprio(pthread_t thread, int priority)
。
檢查man page。
編輯:這裏的示例代碼相當於:
#include <pthread.h>
int main()
{
pthread_t thId = pthread_self();
pthread_attr_t thAttr;
int policy = 0;
int max_prio_for_policy = 0;
pthread_attr_init(&thAttr);
pthread_attr_getschedpolicy(&thAttr, &policy);
max_prio_for_policy = sched_get_priority_max(policy);
pthread_setschedprio(thId, max_prio_for_policy);
pthread_attr_destroy(&thAttr);
return 0;
}
此示例是這是SCHED_OTHER默認的調度策略。
編輯:線程屬性必須在使用前初始化。
像pthread_setschedparam()
和政策和優先級的組合。
我想你會使用策略SCHED_FIFO, SCHED_RR
你可以指定線程的優先級。
你想:
#include <pthread.h>
int main()
{
int policy;
struct sched_param param;
pthread_getschedparam(pthread_self(), &policy, ¶m);
param.sched_priority = sched_get_priority_max(policy);
pthread_setschedparam(pthread_self(), policy, ¶m);
return 0;
}
POSIX標準包括pthread_setschedparam(3)
,通過各種其他的答案中提到。大多數情況下,在討論實時線程時會提到這種POSIX線程庫函數,但POSIX標準並未將其僅用於實時線程領域。但是,在Linux中,如果使用實時調度類SCHED_FIFO
或SCHED_RR
,則它的使用只有真正有意義,因爲只有那些調度類允許多個值用於優先級參數。有關說明,請參見此stack overflow answer。
幸運的是,不幸的是,這是一個問題,似乎主流Linux POSIX線程庫實現(過時的LinuxThreads和當前NPTL實現)並不完全符合POSIX標準,因爲「nice value」不是進程具體但特定於線程的參數,因此您可以使用setpriority(3)
來更改Linux中線程的好處。此聲明基於pthreads(7)
手冊頁中的兼容性說明(在該頁面中搜索「nice value」);我在實踐中沒有經過實際測試(直接做的事)。
如果您決定使用POSIX不符合要求的方式來更改線程的完好性,請注意有人潛意識有人決定修復上述不合規問題,在這種情況下,似乎無法更改線程如果使用普通的調度類(SCHED_OTHER
),則在Linux中優先。
對於那些可能正在搜索基於BSD的操作系統解決方案(如MacOS或iOS)的用戶,您可能需要考慮使用mach而不是POSIX等效項來設置線程的優先級。
#include <mach/mach_init.h>
#include <mach/thread_policy.h>
#include <mach/sched.h>
#include <pthread.h>
int set_realtime(int period, int computation, int constraint) {
struct thread_time_constraint_policy ttcpolicy;
int ret;
thread_port_t threadport = pthread_mach_thread_np(pthread_self());
ttcpolicy.period=period; // HZ/160
ttcpolicy.computation=computation; // HZ/3300;
ttcpolicy.constraint=constraint; // HZ/2200;
ttcpolicy.preemptible=1;
if ((ret=thread_policy_set(threadport,
THREAD_TIME_CONSTRAINT_POLICY, (thread_policy_t)&ttcpolicy,
THREAD_TIME_CONSTRAINT_POLICY_COUNT)) != KERN_SUCCESS) {
fprintf(stderr, "set_realtime() failed.\n");
return 0;
}
return 1;
}
你不能一個指針傳遞給未初始化的'pthread_attr_t'到'pthread_attr_getschedpolicy()'。 – caf
@caf感謝您的提示。我更新了代碼片段。 –
請注意,儘管POSIX標準(從提供的「phtread__setschedprio(3)」手冊頁到http://pubs.opengroup.org/onlinepubs/009695399/functions/xsh_chap02_08的鏈接之後。html#tag_02_08_04_01)提到在'SCHED_OTHER'策略中使用'pthread_setschedprio(3)'運行的線程,在Linux中,優先值的值範圍是[[0,0]),使得這個回答在Linux中無用,除非改變爲使用real時間調度類('SCHED_FIFO'或'SCHED_RR'),這個問題沒有被調用。 – FooF