2017-12-13 17 views
0

Ich versuche, mein Programm in Threads auszuführen, verwende ich pthread_create(), aber es führt die Threads sofort. Ich möchte dem Benutzer erlauben, Thread-Prioritäten vor dem Ausführen zu ändern. Wie ist es möglich zu lösen?erstellen Sie Threads, aber nicht sofort in Linux ausführen

for(int i = 0; i < threads; i++) 
{ 
    pthread_create(data->threads+i,NULL,SelectionSort,data); 
    sleep(1); 
    print(data->array); 
} 
+0

eine Möglichkeit, die Priorität mit dem attr Argument von pthread_create – pm100

+0

@ PM100 einstellen können, ich weiß, wie Priorität zu setzen, ist das Problem, wie nicht Führen Sie die erstellten Threads sofort aus, aber erlauben Sie dem Benutzer, sie auszuführen oder Prioritäten zu ändern, bevor Sie –

+1

ausführen. Suchen Sie nach Ihrem Codeabbild (BAD), das Sie mit C++ verwenden. Markieren Sie C und C++ nicht, es sei denn, es gibt einen Grund. Sie codieren in C++, markieren nur C++, danke. – Stargateur

Antwort

2

Legen Sie die Priorität beim Erstellen des Threads fest.

ersetzen

int local_errno; 

local_errno = pthread_create(..., NULL, ...); 
if (local_errno != 0) { ... } 

mit

int local_errno; 

pthread_attr_t attr; 
local_errno = pthread_attr_init(&attr); 
if (local_errno != 0) { ... } 

{ 
    struct sched_param sp; 
    local_errno = pthread_attr_getschedparam(&attr, &sp); 
    if (local_errno != 0) { ... } 

    sp.sched_priority = ...; 

    local_errno = pthread_attr_setschedparam(&attr, &sp); 
    if (local_errno != 0) { ... } 
}  

/* So our scheduling priority gets used. */ 
local_errno = pthread_attr_setinheritsched(&attr, PTHREAD_EXPLICIT_SCHED); 
if (local_errno != 0) { ... } 

local_errno = pthread_create(..., &attr, ...); 
if (local_errno != 0) { ... } 

local_errno = pthread_attr_destroy(&attr); 
if (local_errno != 0) { ... } 
+0

Ich versuche, wie Sie zu tun, aber gescheitert (es ändert sich nicht Priorität), wo könnte Fehler sein https://pasteboard.co/GY3urhX.png –

+0

Was haben wir Ihnen über Bilder gesagt?!? Und das sieht nicht so aus als was ich gepostet habe?!? – ikegami

+0

Warum ist es schlecht, dass ich einen Link zu dem Foto gebe? Ok, wie kann ich den Code, den ich gepostet habe, neu anordnen? –

1

Für pThreads die Priorität nach Thread-Erzeugung nicht festgelegt, sondern durch geeignete Attribute auf Thread-Erzeugung übergeben: die Fäden Attribute gehen, wo Sie NULL in Ihrem pthread_create() Anruf angegeben haben. Wenn Sie die Erstellung von Threads verzögern möchten, bis der Benutzer Ihnen eine Priorität gegeben hat, können Sie ein Funktionsobjekt erstellen, das die Priorität erwartet, und beim Aufruf dieses Funktionsobjekts würden Sie den Thread starten. Natürlich müssen Sie das so erstellte Objekt immer noch im Auge behalten (möglicherweise unter Verwendung eines std::future<...> - ähnlichen Objekts), um diesem Thread später beizutreten.

Beachten Sie, dass die Angabe einer Antwort nicht als Empfehlung von Thread-Prioritäten interpretiert werden sollte: Soweit ich das beurteilen kann, ist das Spielen mit Thread-Prioritäten schlecht beraten.

Verwandte Themen