Monitor.Enter () quando un thread ha la massima priorità

4

Sfondo

Ok, quindi supponiamo di avere una priorità alta ( ThreadPriority.Highest ) thread t che deve inserire un'area critica per consumare alcuni dati. Userò il seguente snippet di codice per illustrare il mio punto.

// create a consumer thread
t = new Thread(() =>
{
    Monitor.Enter(myLock);

    // consume data

    Monitor.Exit(myLock);
});
t.Name = "Data Consumer";
t.Priority = ThreadPriority.Highest;
t.Start();

Nell'esempio sopra, il thread tenta di entrare nella regione per consumare i dati (quando il blocco è disponibile).

Domanda

Ci sono delle implicazioni sul rendimento che devo sapere quando un thread con la massima priorità sta entrando nella regione v.s. un thread con priorità più bassa che tenta di entrare nella regione?

Per esempio, supponiamo che il thread con la massima priorità non sia in grado di ottenere myLock perché c'è un altro thread occupato con la regione. Il thread con ThreadPriority.Highest consuma molta più CPU quando provi ad entrare nella regione (rispetto a un thread con priorità più bassa)?

    
posta Snoop 10.06.2016 - 16:40
fonte

1 risposta

1

Are there any performance implications I need to know about when a thread of highest priority is entering the region v.s. a lower-priority thread trying to enter the region?

Un problema ben noto con questa situazione è inversione di priorità : se un thread a bassa priorità tiene il blocco, potrebbe rendere il thread ad alta priorità attendere per un lungo periodo (poiché i thread a media priorità sono in fase di pianificazione). Ma gli autori dei sistemi operativi ne sono a conoscenza e tendono ad avere soluzioni per questo .

For instance, let's say that the highest priority thread is not able to obtain the myLock because there is some other thread busy with the region. Is the thread with ThreadPriority.Highest going to consume a lot more CPU when trying to enter the region (as compared with a lower-priority thread)?

No, il processo di presa del blocco non dipende dalla priorità del thread. Se il blocco viene eseguito, il thread non consumerà molta CPU e passerà rapidamente allo stato di sospensione.

    
risposta data 10.07.2016 - 13:34
fonte

Leggi altre domande sui tag