Nel corso del commento allo a recent question, è sorta una domanda sussidiaria su a che punto si può prevedere che venga eseguita una richiesta di cancellazione per un thread di pthreads con annullabilità PTHREAD_CANCEL_DEFERRED
. Riferimenti a the standard e un po 'di giurisprudenza seguì. Non sono molto preoccupato in particolare se mi sono sbagliato nei miei commenti su quella domanda, ma io vorrei essere sicuro di capire correttamente le disposizioni di POSIX.Che cosa significa POSIX che un thread è "sospeso"?
La sezione più pertinente della norma dice
Quando un thread è cancelability abilitato e una richiesta di cancellazione è stato fornito con quel filo come destinazione, e il filo chiede allora qualsiasi funzione che è un punto di cancellazione [...], la richiesta di cancellazione deve essere applicata prima che la funzione ritorni. Se una discussione ha annullabilità abilitata e una richiesta di cancellazione viene effettuata con il thread come destinazione mentre la discussione è sospesa in un punto di annullamento, il thread deve essere risvegliato e la richiesta di cancellazione deve essere presa in considerazione.
Cosa significa, tuttavia, che un thread sia "sospeso"? POSIX definisce esplicitamente il termine per i processi, ma non, per quanto posso determinare, per i thread. D'altra parte, POSIX documenta la sospensione del thread tra i comportamenti di una manciata di funzioni, incluse, ma non limitate a, alcune di quelle relative agli oggetti di sincronizzazione. Si dovrebbe quindi concludere che quelli servono collettivamente come la definizione pertinente del termine?
E come tutto questo riguarda la questione che ha generato questa linea di indagine, dato che POSIX non specifica sospensione filo come parte del comportamento di read()
, fread()
, o uno qualsiasi dei file generale o lo streaming di funzioni di I/O, se un thread non sta facendo progressi per essere bloccato su I/O, significa necessariamente che è "sospeso" ai fini della cancellazione?
Lo standard IEEE 1003.1 (POSIX) afferma esplicitamente che è allineato con lo standard ISO/IEC 9899 (C). Lo standard C cita [ISO/IEC 2382 (Vocabolario della tecnologia dell'informazione)] (https://www.iso.org/obp/ui/#iso:std:iso-iec:2382:ed-1:v1:en) per il suo gergo. Sfortunatamente, nemmeno ISO/IEC 2382 definisce _suspended_, e persino usa quella parola in alcune delle definizioni. Quello che ne deduco è che "sospeso" è considerato una parola chiave inglese, adatta per l'uso nelle spiegazioni. La mia interpretazione personale di sospeso è "lo stato di un thread che non utilizza attualmente il tempo del processore". –
@IwillnotexistIdonotexist, l'allineamento con C è un'osservazione utile, grazie. Trovo che "attualmente non usi il tempo del processore" sia un'interpretazione preoccupante, perché sembra che copra i thread che * potrebbe * essere in esecuzione, ma che sono stati anticipati. Ciò non sembra corrispondere: ogni indicazione è che la sospensione del thread è uno stato in cui un thread * viene * impedito * in esecuzione anche se la CPU sarebbe altrimenti disponibile per esso. Può darsi che gli standard C e POSIX presuppongano l'applicazione di un'interpretazione naturale, ma i dettagli sono importanti e non sono chiari (per me). –
Mi sembra naturale pensare che i thread eseguibili che non sono in esecuzione siano sospesi, per mancanza di una parola migliore.Su un processore 'n'-core molto carico, potrebbero esserci'> n' _runnable_ processes, ma al massimo 'n' di questi possono essere creati _running_; Tutti gli altri devono essere _not-running_, o come POSIX _might_ averlo, "la loro esecuzione è sospesa" in attesa del loro turno. Cosa ne pensi? Un thread eseguibile attende che il quantum del tempo di un thread in esecuzione scada sospeso? Che ne dite di un thread in esecuzione il cui quantum scade e, anche se ancora eseguibile, viene disattivato? Che dire dei thread interrotti? –