2012-06-04 13 views
12

कोड के निम्नलिखित बिट को देखते हुए, मैं सोच रहा था कि लिनक्स में कोड के बराबर बिट क्या होगा या बूस्ट का उपयोग करने के लिए भी। थ्रेड एपीआई।लिनक्स पर सेट थ्रेडप्रोरिटी के समतुल्य (pthreads)

#include <windows.h> 

int main() 
{ 
    SetThreadPriority(GetCurrentThread(),THREAD_PRIORITY_HIGHEST); 
    return 0; 
} 

उत्तर

22

लिनक्स में 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 है के लिए है: यहां नमूना कोड बराबर है।

संपादित करें: थ्रेड विशेषता उपयोग से पहले शुरू की जानी चाहिए।

+1

आप 'pthread_attr_getschedpolicy के लिए एक uninitialised' pthread_attr_t' के लिए सूचक पारित नहीं हो सकता() '। – caf

+0

@caf संकेत के लिए धन्यवाद। मैंने कोड स्निपेट अपडेट किया है। –

+4

ध्यान दें कि हालांकि POSIX मानक (प्रदान किए गए 'phtread__setschedprio (3)' मैन्युअल पृष्ठ से http://pubs.opengroup.org/onlinepubs/009695399/functions/xsh_chap02_08 पर दिए गए लिंक के बाद।एचटीएमएल # टैग_02_08_04_01) लिनक्स में 'SCHED_OTHER' नीति में चल रहे धागे के लिए 'pthread_setschedprio (3)' का उपयोग करने का उल्लेख करता है, प्राथमिकता मान के लिए मान सीमा '[0, 0] है, जो इस उत्तर को लिनक्स के लिए बेकार बना देती है, जब तक कि वास्तविक उपयोग नहीं किया जाता समय सारिणी कक्षाएं ('SCHED_FIFO' या' SCHED_RR') जो प्रश्न से अनिश्चित हैं। – FooF

3

कुछ pthread_setschedparam() और नीति और प्राथमिकता के संयोजन की तरह कुछ।

मुझे लगता है कि आप नीतियों का उपयोग करेंगे SCHED_FIFO, SCHED_RR जहां आप थ्रेड की प्राथमिकता निर्दिष्ट कर सकते हैं।

16

आप चाहते हैं:

#include <pthread.h> 

int main() 
{ 
    int policy; 
    struct sched_param param; 

    pthread_getschedparam(pthread_self(), &policy, &param); 
    param.sched_priority = sched_get_priority_max(policy); 
    pthread_setschedparam(pthread_self(), policy, &param); 

    return 0; 
} 
5

POSIX मानक pthread_setschedparam(3) के रूप में विभिन्न अन्य उत्तर ने उल्लेख भी शामिल है,। अधिकांशतः इस पॉज़िक्स थ्रेड लाइब्रेरी फ़ंक्शन का उल्लेख वास्तविक समय के थ्रेड की बात करते समय किया जाता है, लेकिन POSIX मानक वास्तविक रूप से रीयल-टाइम थ्रेड के डोमेन पर इसका उपयोग सीमित नहीं करता है। हालांकि, लिनक्स में इसका उपयोग केवल वास्तविक अर्थपूर्ण है यदि रीयल टाइम शेड्यूलिंग क्लासेस SCHED_FIFO या SCHED_RR का उपयोग कर रहे हैं क्योंकि केवल शेड्यूलिंग क्लासेस प्राथमिकता पैरामीटर के लिए एक से अधिक मान की अनुमति देते हैं। एक उदाहरण के लिए यह stack overflow answer देखें।

सौभाग्य से या दुर्भाग्यवश, यह परिप्रेक्ष्य का विषय है, ऐसा लगता है कि मुख्य धारा लिनक्स पॉज़िक्स थ्रेड लाइब्रेरी कार्यान्वयन (अप्रचलित लिनक्स थ्रेड और वर्तमान एनपीटीएल कार्यान्वयन) दोनों पूरी तरह से POSIX अनुरूप नहीं हैं कि "अच्छा मूल्य" प्रक्रिया नहीं है विशिष्ट लेकिन थ्रेड विशिष्ट पैरामीटर, इसलिए ऐसा लगता है कि आप लिनक्स में थ्रेड की अच्छीता को बदलने के लिए setpriority(3) का उपयोग कर सकते हैं। यह दावा संगतता नोट्स पर आधारित है pthreads(7) मैनुअल पेज (उस पृष्ठ में "अच्छा मूल्य" खोजें); मैंने वास्तव में अभ्यास में परीक्षण नहीं किया है (करने के लिए सीधी चीज)।

क्या आप थॉमस अच्छीता को बदलने के POSIX के असंगत तरीके का उपयोग करने का निर्णय लेना चाहते हैं, ध्यान दें कि कोई आश्चर्यजनक संभावना है कि कोई भी उल्लिखित गैर-अनुपालन को ठीक करने का निर्णय लेता है, इस मामले में धागे को बदलने का कोई तरीका नहीं लगता है सामान्य शेड्यूलिंग क्लास (SCHED_OTHER) का उपयोग करते हुए लिनक्स में प्राथमिकता।

0

उन लोगों के लिए जो मैकोज़ या आईओएस जैसे बीएसडी आधारित ओएस समाधान की खोज कर रहे हैं, आप आवश्यक होने पर पॉज़िक्स समकक्ष के बजाय मच का उपयोग करके थ्रेड की प्राथमिकता को सेट करना चाह सकते हैं।

#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; 
} 

स्रोत: https://developer.apple.com/library/content/documentation/Darwin/Conceptual/KernelProgramming/scheduler/scheduler.html

संबंधित मुद्दे