€•€tŒsphinx.addnodes”Œdocument”“”)”}”(Œ rawsource”Œ”Œchildren”]”(Œ translations”Œ LanguagesNode”“”)”}”(hhh]”(hŒ pending_xref”“”)”}”(hhh]”Œdocutils.nodes”ŒText”“”ŒEnglish”…””}”Œparent”hsbaŒ attributes”}”(Œids”]”Œclasses”]”Œnames”]”Œdupnames”]”Œbackrefs”]”Œ refdomain”Œstd”Œreftype”Œdoc”Œ reftarget”Œ$/process/volatile-considered-harmful”Œmodname”NŒ classname”NŒ refexplicit”ˆuŒtagname”hhh ubh)”}”(hhh]”hŒChinese (Simplified)”…””}”hh2sbah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”h)Œreftype”h+Œ reftarget”Œ7/translations/zh_CN/process/volatile-considered-harmful”Œmodname”NŒ classname”NŒ refexplicit”ˆuh1hhh ubh)”}”(hhh]”hŒChinese (Traditional)”…””}”hhFsbah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”h)Œreftype”h+Œ reftarget”Œ7/translations/zh_TW/process/volatile-considered-harmful”Œmodname”NŒ classname”NŒ refexplicit”ˆuh1hhh ubh)”}”(hhh]”hŒJapanese”…””}”hhZsbah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”h)Œreftype”h+Œ reftarget”Œ7/translations/ja_JP/process/volatile-considered-harmful”Œmodname”NŒ classname”NŒ refexplicit”ˆuh1hhh ubh)”}”(hhh]”hŒKorean”…””}”hhnsbah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”h)Œreftype”h+Œ reftarget”Œ7/translations/ko_KR/process/volatile-considered-harmful”Œmodname”NŒ classname”NŒ refexplicit”ˆuh1hhh ubh)”}”(hhh]”hŒPortuguese (Brazilian)”…””}”hh‚sbah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”h)Œreftype”h+Œ reftarget”Œ7/translations/pt_BR/process/volatile-considered-harmful”Œmodname”NŒ classname”NŒ refexplicit”ˆuh1hhh ubh)”}”(hhh]”hŒSpanish”…””}”hh–sbah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”h)Œreftype”h+Œ reftarget”Œ7/translations/sp_SP/process/volatile-considered-harmful”Œmodname”NŒ classname”NŒ refexplicit”ˆuh1hhh ubeh}”(h]”h ]”h"]”h$]”h&]”Œcurrent_language”ŒItalian”uh1h hhŒ _document”hŒsource”NŒline”NubhŒwarning”“”)”}”(hŒ×In caso di dubbi sulla correttezza del contenuto di questa traduzione, l'unico riferimento valido è la documentazione ufficiale in inglese. Per maggiori informazioni consultate le :ref:`avvertenze `.”h]”hŒ paragraph”“”)”}”(hŒ×In caso di dubbi sulla correttezza del contenuto di questa traduzione, l'unico riferimento valido è la documentazione ufficiale in inglese. Per maggiori informazioni consultate le :ref:`avvertenze `.”h]”(hŒ·In caso di dubbi sulla correttezza del contenuto di questa traduzione, l’unico riferimento valido è la documentazione ufficiale in inglese. Per maggiori informazioni consultate le ”…””}”(hh½h²hh³Nh´Nubh)”}”(hŒ!:ref:`avvertenze `”h]”hŒinline”“”)”}”(hhÇh]”hŒ avvertenze”…””}”(hhËh²hh³Nh´Nubah}”(h]”h ]”(Œxref”Œstd”Œstd-ref”eh"]”h$]”h&]”uh1hÉhhÅubah}”(h]”h ]”h"]”h$]”h&]”Œrefdoc”Œ6translations/it_IT/process/volatile-considered-harmful”Œ refdomain”hÖŒreftype”Œref”Œ refexplicit”ˆŒrefwarn”ˆŒ reftarget”Œ it_disclaimer”uh1hh³Œ3Documentation/translations/it_IT/disclaimer-ita.rst”h´Khh½ubhŒ.”…””}”(hh½h²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1h»h³hêh´Khh·ubah}”(h]”h ]”h"]”h$]”h&]”uh1hµhhh²hh³hêh´NubhŒ field_list”“”)”}”(hhh]”(hŒfield”“”)”}”(hhh]”(hŒ field_name”“”)”}”(hŒOriginal”h]”hŒOriginal”…””}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjh³Œd/var/lib/git/docbuild/linux/Documentation/translations/it_IT/process/volatile-considered-harmful.rst”h´KubhŒ field_body”“”)”}”(hŒZ:ref:`Documentation/process/volatile-considered-harmful.rst `”h]”h¼)”}”(hjh]”h)”}”(hjh]”hÊ)”}”(hjh]”hŒ5Documentation/process/volatile-considered-harmful.rst”…””}”(hj"h²hh³Nh´Nubah}”(h]”h ]”(hÕŒstd”Œstd-ref”eh"]”h$]”h&]”uh1hÉhjubah}”(h]”h ]”h"]”h$]”h&]”Œrefdoc”h⌠refdomain”j,Œreftype”Œref”Œ refexplicit”ˆŒrefwarn”ˆhèŒvolatile_considered_harmful”uh1hh³jh´Khjubah}”(h]”h ]”h"]”h$]”h&]”uh1h»h³jh´Khjubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjubeh}”(h]”h ]”h"]”h$]”h&]”uh1jh³jh´Khhýh²hubj)”}”(hhh]”(j)”}”(hŒ Translator”h]”hŒ Translator”…””}”(hjSh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjPh³jh´Kubj)”}”(hŒ)Federico Vaga ”h]”h¼)”}”(hŒ(Federico Vaga ”h]”(hŒFederico Vaga <”…””}”(hjeh²hh³Nh´NubhŒ reference”“”)”}”(hŒfederico.vaga@vaga.pv.it”h]”hŒfederico.vaga@vaga.pv.it”…””}”(hjoh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”Œrefuri”Œmailto:federico.vaga@vaga.pv.it”uh1jmhjeubhŒ>”…””}”(hjeh²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1h»h³jh´Khjaubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjPubeh}”(h]”h ]”h"]”h$]”h&]”uh1jh³jh´Khhýh²hubeh}”(h]”h ]”h"]”h$]”h&]”uh1hûhhh²hh³jh´KubhŒtarget”“”)”}”(hŒ#.. _it_volatile_considered_harmful:”h]”h}”(h]”h ]”h"]”h$]”h&]”Œrefid”Œit-volatile-considered-harmful”uh1j›h´Khhh²hh³jubhŒsection”“”)”}”(hhh]”(hŒtitle”“”)”}”(hŒ=Perché la parola chiave "volatile" non dovrebbe essere usata”h]”hŒAPerché la parola chiave “volatile†non dovrebbe essere usata”…””}”(hj°h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j®hj«h²hh³jh´K ubh¼)”}”(hXÛSpesso i programmatori C considerano volatili quelle variabili che potrebbero essere cambiate al di fuori dal thread di esecuzione corrente; come risultato, a volte saranno tentati dall'utilizzare *volatile* nel kernel per le strutture dati condivise. In altre parole, gli è stato insegnato ad usare *volatile* come una variabile atomica di facile utilizzo, ma non è così. L'uso di *volatile* nel kernel non è quasi mai corretto; questo documento ne descrive le ragioni.”h]”(hŒÇSpesso i programmatori C considerano volatili quelle variabili che potrebbero essere cambiate al di fuori dal thread di esecuzione corrente; come risultato, a volte saranno tentati dall’utilizzare ”…””}”(hj¾h²hh³Nh´NubhŒemphasis”“”)”}”(hŒ *volatile*”h]”hŒvolatile”…””}”(hjÈh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jÆhj¾ubhŒ_ nel kernel per le strutture dati condivise. In altre parole, gli è stato insegnato ad usare ”…””}”(hj¾h²hh³Nh´NubjÇ)”}”(hŒ *volatile*”h]”hŒvolatile”…””}”(hjÚh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jÆhj¾ubhŒL come una variabile atomica di facile utilizzo, ma non è così. L’uso di ”…””}”(hj¾h²hh³Nh´NubjÇ)”}”(hŒ *volatile*”h]”hŒvolatile”…””}”(hjìh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jÆhj¾ubhŒO nel kernel non è quasi mai corretto; questo documento ne descrive le ragioni.”…””}”(hj¾h²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1h»h³jh´K hj«h²hubh¼)”}”(hXÍIl punto chiave da capire su *volatile* è che il suo scopo è quello di sopprimere le ottimizzazioni, che non è quasi mai quello che si vuole. Nel kernel si devono proteggere le strutture dati condivise contro accessi concorrenti e indesiderati: questa è un'attività completamente diversa. Il processo di protezione contro gli accessi concorrenti indesiderati eviterà anche la maggior parte dei problemi relativi all'ottimizzazione in modo più efficiente.”h]”(hŒIl punto chiave da capire su ”…””}”(hjh²hh³Nh´NubjÇ)”}”(hŒ *volatile*”h]”hŒvolatile”…””}”(hj h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jÆhjubhXª è che il suo scopo è quello di sopprimere le ottimizzazioni, che non è quasi mai quello che si vuole. Nel kernel si devono proteggere le strutture dati condivise contro accessi concorrenti e indesiderati: questa è un’attività completamente diversa. Il processo di protezione contro gli accessi concorrenti indesiderati eviterà anche la maggior parte dei problemi relativi all’ottimizzazione in modo più efficiente.”…””}”(hjh²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1h»h³jh´Khj«h²hubh¼)”}”(hXãCome *volatile*, le primitive del kernel che rendono sicuro l'accesso ai dati (spinlock, mutex, barriere di sincronizzazione, ecc) sono progettate per prevenire le ottimizzazioni indesiderate. Se vengono usate opportunamente, non ci sarà bisogno di utilizzare *volatile*. Se vi sembra che *volatile* sia comunque necessario, ci dev'essere quasi sicuramente un baco da qualche parte. In un pezzo di codice kernel scritto a dovere, *volatile* può solo servire a rallentare le cose.”h]”(hŒCome ”…””}”(hj$h²hh³Nh´NubjÇ)”}”(hŒ *volatile*”h]”hŒvolatile”…””}”(hj,h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jÆhj$ubhŒù, le primitive del kernel che rendono sicuro l’accesso ai dati (spinlock, mutex, barriere di sincronizzazione, ecc) sono progettate per prevenire le ottimizzazioni indesiderate. Se vengono usate opportunamente, non ci sarà bisogno di utilizzare ”…””}”(hj$h²hh³Nh´NubjÇ)”}”(hŒ *volatile*”h]”hŒvolatile”…””}”(hj>h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jÆhj$ubhŒ. Se vi sembra che ”…””}”(hj$h²hh³Nh´NubjÇ)”}”(hŒ *volatile*”h]”hŒvolatile”…””}”(hjPh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jÆhj$ubhŒ… sia comunque necessario, ci dev’essere quasi sicuramente un baco da qualche parte. In un pezzo di codice kernel scritto a dovere, ”…””}”(hj$h²hh³Nh´NubjÇ)”}”(hŒ *volatile*”h]”hŒvolatile”…””}”(hjbh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jÆhj$ubhŒ( può solo servire a rallentare le cose.”…””}”(hj$h²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1h»h³jh´Khj«h²hubh¼)”}”(hŒ3Considerate questo tipico blocco di codice kernel::”h]”hŒ2Considerate questo tipico blocco di codice kernel:”…””}”(hjzh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h»h³jh´K#hj«h²hubhŒ literal_block”“”)”}”(hŒrspin_lock(&the_lock); do_something_on(&shared_data); do_something_else_with(&shared_data); spin_unlock(&the_lock);”h]”hŒrspin_lock(&the_lock); do_something_on(&shared_data); do_something_else_with(&shared_data); spin_unlock(&the_lock);”…””}”hjŠsbah}”(h]”h ]”h"]”h$]”h&]”Œ xml:space”Œpreserve”uh1jˆh³jh´K%hj«h²hubh¼)”}”(hX•Se tutto il codice seguisse le regole di sincronizzazione, il valore di un dato condiviso non potrebbe cambiare inaspettatamente mentre si trattiene un lock. Un qualsiasi altro blocco di codice che vorrà usare quel dato rimarrà in attesa del lock. Gli spinlock agiscono come barriere di sincronizzazione - sono stati esplicitamente scritti per agire così - il che significa che gli accessi al dato condiviso non saranno ottimizzati. Quindi il compilatore potrebbe pensare di sapere cosa ci sarà nel dato condiviso ma la chiamata spin_lock(), che agisce come una barriera di sincronizzazione, gli imporrà di dimenticarsi tutto ciò che sapeva su di esso.”h]”hX•Se tutto il codice seguisse le regole di sincronizzazione, il valore di un dato condiviso non potrebbe cambiare inaspettatamente mentre si trattiene un lock. Un qualsiasi altro blocco di codice che vorrà usare quel dato rimarrà in attesa del lock. Gli spinlock agiscono come barriere di sincronizzazione - sono stati esplicitamente scritti per agire così - il che significa che gli accessi al dato condiviso non saranno ottimizzati. Quindi il compilatore potrebbe pensare di sapere cosa ci sarà nel dato condiviso ma la chiamata spin_lock(), che agisce come una barriera di sincronizzazione, gli imporrà di dimenticarsi tutto ciò che sapeva su di esso.”…””}”(hjšh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h»h³jh´K*hj«h²hubh¼)”}”(hXèSe il dato condiviso fosse stato dichiarato come *volatile*, la sincronizzazione rimarrebbe comunque necessaria. Ma verrà impedito al compilatore di ottimizzare gli accessi al dato anche _dentro_ alla sezione critica, dove sappiamo che in realtà nessun altro può accedervi. Mentre si trattiene un lock, il dato condiviso non è *volatile*. Quando si ha a che fare con dei dati condivisi, un'opportuna sincronizzazione rende inutile l'uso di *volatile* - anzi potenzialmente dannoso.”h]”(hŒ1Se il dato condiviso fosse stato dichiarato come ”…””}”(hj¨h²hh³Nh´NubjÇ)”}”(hŒ *volatile*”h]”hŒvolatile”…””}”(hj°h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jÆhj¨ubhX, la sincronizzazione rimarrebbe comunque necessaria. Ma verrà impedito al compilatore di ottimizzare gli accessi al dato anche _dentro_ alla sezione critica, dove sappiamo che in realtà nessun altro può accedervi. Mentre si trattiene un lock, il dato condiviso non è ”…””}”(hj¨h²hh³Nh´NubjÇ)”}”(hŒ *volatile*”h]”hŒvolatile”…””}”(hjÂh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jÆhj¨ubhŒl. Quando si ha a che fare con dei dati condivisi, un’opportuna sincronizzazione rende inutile l’uso di ”…””}”(hj¨h²hh³Nh´NubjÇ)”}”(hŒ *volatile*”h]”hŒvolatile”…””}”(hjÔh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jÆhj¨ubhŒ - anzi potenzialmente dannoso.”…””}”(hj¨h²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1h»h³jh´K4hj«h²hubh¼)”}”(hX‰L'uso di *volatile* fu originalmente pensato per l'accesso ai registri di I/O mappati in memoria. All'interno del kernel, l'accesso ai registri, dovrebbe essere protetto dai lock, ma si potrebbe anche desiderare che il compilatore non "ottimizzi" l'accesso ai registri all'interno di una sezione critica. Ma, all'interno del kernel, l'accesso alla memoria di I/O viene sempre fatto attraverso funzioni d'accesso; accedere alla memoria di I/O direttamente con i puntatori è sconsigliato e non funziona su tutte le architetture. Queste funzioni d'accesso sono scritte per evitare ottimizzazioni indesiderate, quindi, di nuovo, *volatile* è inutile.”h]”(hŒ L’uso di ”…””}”(hjìh²hh³Nh´NubjÇ)”}”(hŒ *volatile*”h]”hŒvolatile”…””}”(hjôh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jÆhjìubhXv fu originalmente pensato per l’accesso ai registri di I/O mappati in memoria. All’interno del kernel, l’accesso ai registri, dovrebbe essere protetto dai lock, ma si potrebbe anche desiderare che il compilatore non “ottimizzi†l’accesso ai registri all’interno di una sezione critica. Ma, all’interno del kernel, l’accesso alla memoria di I/O viene sempre fatto attraverso funzioni d’accesso; accedere alla memoria di I/O direttamente con i puntatori è sconsigliato e non funziona su tutte le architetture. Queste funzioni d’accesso sono scritte per evitare ottimizzazioni indesiderate, quindi, di nuovo, ”…””}”(hjìh²hh³Nh´NubjÇ)”}”(hŒ *volatile*”h]”hŒvolatile”…””}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jÆhjìubhŒ è inutile.”…””}”(hjìh²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1h»h³jh´Ksbah}”(h]”h ]”h"]”h$]”h&]”j˜j™uh1jˆh³jh´KJhj«h²hubh¼)”}”(hXNLa chiamata cpu_relax() può ridurre il consumo di energia del processore o cedere il passo ad un processore hyperthreaded gemello; funziona anche come una barriera per il compilatore, quindi, ancora una volta, *volatile* non è necessario. Ovviamente, tanto per puntualizzare, le attese attive sono generalmente un atto antisociale.”h]”(hŒÓLa chiamata cpu_relax() può ridurre il consumo di energia del processore o cedere il passo ad un processore hyperthreaded gemello; funziona anche come una barriera per il compilatore, quindi, ancora una volta, ”…””}”(hjLh²hh³Nh´NubjÇ)”}”(hŒ *volatile*”h]”hŒvolatile”…””}”(hjTh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jÆhjLubhŒq non è necessario. Ovviamente, tanto per puntualizzare, le attese attive sono generalmente un atto antisociale.”…””}”(hjLh²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1h»h³jh´KMhj«h²hubh¼)”}”(hŒUCi sono comunque alcune rare situazioni dove l'uso di *volatile* nel kernel ha senso:”h]”(hŒ8Ci sono comunque alcune rare situazioni dove l’uso di ”…””}”(hjlh²hh³Nh´NubjÇ)”}”(hŒ *volatile*”h]”hŒvolatile”…””}”(hjth²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jÆhjlubhŒ nel kernel ha senso:”…””}”(hjlh²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1h»h³jh´KShj«h²hubhŒ block_quote”“”)”}”(hX8- Le funzioni d'accesso sopracitate potrebbero usare *volatile* su quelle architetture che supportano l'accesso diretto alla memoria di I/O. In pratica, ogni chiamata ad una funzione d'accesso diventa una piccola sezione critica a se stante, e garantisce che l'accesso avvenga secondo le aspettative del programmatore. - I codice *inline assembly* che fa cambiamenti nella memoria, ma che non ha altri effetti espliciti, rischia di essere rimosso da GCC. Aggiungere la parola chiave *volatile* a questo codice ne previene la rimozione. - La variabile jiffies è speciale in quanto assume un valore diverso ogni volta che viene letta ma può essere lette senza alcuna sincronizzazione. Quindi jiffies può essere *volatile*, ma l'aggiunta ad altre variabili di questo è sconsigliata. Jiffies è considerata uno "stupido retaggio" (parole di Linus) in questo contesto; correggerla non ne varrebbe la pena e causerebbe più problemi. - I puntatori a delle strutture dati in una memoria coerente che potrebbe essere modificata da dispositivi di I/O può, a volte, essere legittimamente *volatile*. Un esempio pratico può essere quello di un adattatore di rete che utilizza un puntatore ad un buffer circolare, questo viene cambiato dall'adattatore per indicare quali descrittori sono stati processati. ”h]”hŒ bullet_list”“”)”}”(hhh]”(hŒ list_item”“”)”}”(hX=Le funzioni d'accesso sopracitate potrebbero usare *volatile* su quelle architetture che supportano l'accesso diretto alla memoria di I/O. In pratica, ogni chiamata ad una funzione d'accesso diventa una piccola sezione critica a se stante, e garantisce che l'accesso avvenga secondo le aspettative del programmatore. ”h]”h¼)”}”(hX<Le funzioni d'accesso sopracitate potrebbero usare *volatile* su quelle architetture che supportano l'accesso diretto alla memoria di I/O. In pratica, ogni chiamata ad una funzione d'accesso diventa una piccola sezione critica a se stante, e garantisce che l'accesso avvenga secondo le aspettative del programmatore.”h]”(hŒ5Le funzioni d’accesso sopracitate potrebbero usare ”…””}”(hjh²hh³Nh´NubjÇ)”}”(hŒ *volatile*”h]”hŒvolatile”…””}”(hj¥h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jÆhjubhX su quelle architetture che supportano l’accesso diretto alla memoria di I/O. In pratica, ogni chiamata ad una funzione d’accesso diventa una piccola sezione critica a se stante, e garantisce che l’accesso avvenga secondo le aspettative del programmatore.”…””}”(hjh²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1h»h³jh´KVhj™ubah}”(h]”h ]”h"]”h$]”h&]”uh1j—hj”ubj˜)”}”(hŒØI codice *inline assembly* che fa cambiamenti nella memoria, ma che non ha altri effetti espliciti, rischia di essere rimosso da GCC. Aggiungere la parola chiave *volatile* a questo codice ne previene la rimozione. ”h]”h¼)”}”(hŒ×I codice *inline assembly* che fa cambiamenti nella memoria, ma che non ha altri effetti espliciti, rischia di essere rimosso da GCC. Aggiungere la parola chiave *volatile* a questo codice ne previene la rimozione.”h]”(hŒ I codice ”…””}”(hjÇh²hh³Nh´NubjÇ)”}”(hŒ*inline assembly*”h]”hŒinline assembly”…””}”(hjÏh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jÆhjÇubhŒ‰ che fa cambiamenti nella memoria, ma che non ha altri effetti espliciti, rischia di essere rimosso da GCC. Aggiungere la parola chiave ”…””}”(hjÇh²hh³Nh´NubjÇ)”}”(hŒ *volatile*”h]”hŒvolatile”…””}”(hjáh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jÆhjÇubhŒ* a questo codice ne previene la rimozione.”…””}”(hjÇh²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1h»h³jh´K\hjÃubah}”(h]”h ]”h"]”h$]”h&]”uh1j—hj”ubj˜)”}”(hX‹La variabile jiffies è speciale in quanto assume un valore diverso ogni volta che viene letta ma può essere lette senza alcuna sincronizzazione. Quindi jiffies può essere *volatile*, ma l'aggiunta ad altre variabili di questo è sconsigliata. Jiffies è considerata uno "stupido retaggio" (parole di Linus) in questo contesto; correggerla non ne varrebbe la pena e causerebbe più problemi. ”h]”h¼)”}”(hXŠLa variabile jiffies è speciale in quanto assume un valore diverso ogni volta che viene letta ma può essere lette senza alcuna sincronizzazione. Quindi jiffies può essere *volatile*, ma l'aggiunta ad altre variabili di questo è sconsigliata. Jiffies è considerata uno "stupido retaggio" (parole di Linus) in questo contesto; correggerla non ne varrebbe la pena e causerebbe più problemi.”h]”(hŒ®La variabile jiffies è speciale in quanto assume un valore diverso ogni volta che viene letta ma può essere lette senza alcuna sincronizzazione. Quindi jiffies può essere ”…””}”(hjh²hh³Nh´NubjÇ)”}”(hŒ *volatile*”h]”hŒvolatile”…””}”(hj h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jÆhjubhŒØ, ma l’aggiunta ad altre variabili di questo è sconsigliata. Jiffies è considerata uno “stupido retaggio†(parole di Linus) in questo contesto; correggerla non ne varrebbe la pena e causerebbe più problemi.”…””}”(hjh²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1h»h³jh´K`hjÿubah}”(h]”h ]”h"]”h$]”h&]”uh1j—hj”ubj˜)”}”(hXoI puntatori a delle strutture dati in una memoria coerente che potrebbe essere modificata da dispositivi di I/O può, a volte, essere legittimamente *volatile*. Un esempio pratico può essere quello di un adattatore di rete che utilizza un puntatore ad un buffer circolare, questo viene cambiato dall'adattatore per indicare quali descrittori sono stati processati. ”h]”h¼)”}”(hXnI puntatori a delle strutture dati in una memoria coerente che potrebbe essere modificata da dispositivi di I/O può, a volte, essere legittimamente *volatile*. Un esempio pratico può essere quello di un adattatore di rete che utilizza un puntatore ad un buffer circolare, questo viene cambiato dall'adattatore per indicare quali descrittori sono stati processati.”h]”(hŒ•I puntatori a delle strutture dati in una memoria coerente che potrebbe essere modificata da dispositivi di I/O può, a volte, essere legittimamente ”…””}”(hj-h²hh³Nh´NubjÇ)”}”(hŒ *volatile*”h]”hŒvolatile”…””}”(hj5h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jÆhj-ubhŒÑ. Un esempio pratico può essere quello di un adattatore di rete che utilizza un puntatore ad un buffer circolare, questo viene cambiato dall’adattatore per indicare quali descrittori sono stati processati.”…””}”(hj-h²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1h»h³jh´Kghj)ubah}”(h]”h ]”h"]”h$]”h&]”uh1j—hj”ubeh}”(h]”h ]”h"]”h$]”h&]”Œbullet”Œ-”uh1j’h³jh´KVhjŽubah}”(h]”h ]”h"]”h$]”h&]”uh1jŒh³jh´KVhj«h²hubh¼)”}”(hXFPer la maggior parte del codice, nessuna delle giustificazioni sopracitate può essere considerata. Di conseguenza, l'uso di *volatile* è probabile che venga visto come un baco e porterà a verifiche aggiuntive. Gli sviluppatori tentati dall'uso di *volatile* dovrebbero fermarsi e pensare a cosa vogliono davvero ottenere.”h]”(hŒ€Per la maggior parte del codice, nessuna delle giustificazioni sopracitate può essere considerata. Di conseguenza, l’uso di ”…””}”(hjah²hh³Nh´NubjÇ)”}”(hŒ *volatile*”h]”hŒvolatile”…””}”(hjih²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jÆhjaubhŒv è probabile che venga visto come un baco e porterà a verifiche aggiuntive. Gli sviluppatori tentati dall’uso di ”…””}”(hjah²hh³Nh´NubjÇ)”}”(hŒ *volatile*”h]”hŒvolatile”…””}”(hj{h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jÆhjaubhŒ@ dovrebbero fermarsi e pensare a cosa vogliono davvero ottenere.”…””}”(hjah²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1h»h³jh´Kmhj«h²hubh¼)”}”(hŒÎLe modifiche che rimuovono variabili *volatile* sono generalmente ben accette - purché accompagnate da una giustificazione che dimostri che i problemi di concorrenza siano stati opportunamente considerati.”h]”(hŒ%Le modifiche che rimuovono variabili ”…””}”(hj“h²hh³Nh´NubjÇ)”}”(hŒ *volatile*”h]”hŒvolatile”…””}”(hj›h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jÆhj“ubhŒŸ sono generalmente ben accette - purché accompagnate da una giustificazione che dimostri che i problemi di concorrenza siano stati opportunamente considerati.”…””}”(hj“h²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1h»h³jh´Kshj«h²hubjª)”}”(hhh]”(j¯)”}”(hŒ Riferimenti”h]”hŒ Riferimenti”…””}”(hj¶h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j®hj³h²hh³jh´Kxubh¼)”}”(hŒ$[1] https://lwn.net/Articles/233481/”h]”(hŒ[1] ”…””}”(hjÄh²hh³Nh´Nubjn)”}”(hŒ https://lwn.net/Articles/233481/”h]”hŒ https://lwn.net/Articles/233481/”…””}”(hjÌh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”Œrefuri”jÎuh1jmhjÄubeh}”(h]”h ]”h"]”h$]”h&]”uh1h»h³jh´Kzhj³h²hubh¼)”}”(hŒ$[2] https://lwn.net/Articles/233482/”h]”(hŒ[2] ”…””}”(hjáh²hh³Nh´Nubjn)”}”(hŒ https://lwn.net/Articles/233482/”h]”hŒ https://lwn.net/Articles/233482/”…””}”(hjéh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”Œrefuri”jëuh1jmhjáubeh}”(h]”h ]”h"]”h$]”h&]”uh1h»h³jh´K|hj³h²hubeh}”(h]”Œ riferimenti”ah ]”h"]”Œ riferimenti”ah$]”h&]”uh1j©hj«h²hh³jh´Kxubjª)”}”(hhh]”(j¯)”}”(hŒCrediti”h]”hŒCrediti”…””}”(hj h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j®hjh²hh³jh´Kubh¼)”}”(hŒ+Impulso e ricerca originale di Randy Dunlap”h]”hŒ+Impulso e ricerca originale di Randy Dunlap”…””}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h»h³jh´Khjh²hubh¼)”}”(hŒScritto da Jonathan Corbet”h]”hŒScritto da Jonathan Corbet”…””}”(hj%h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h»h³jh´Kƒhjh²hubh¼)”}”(hŒŠMigliorato dai commenti di Satyam Sharma, Johannes Stezenbach, Jesper Juhl, Heikki Orsila, H. Peter Anvin, Philipp Hahn, e Stefan Richter.”h]”hŒŠMigliorato dai commenti di Satyam Sharma, Johannes Stezenbach, Jesper Juhl, Heikki Orsila, H. Peter Anvin, Philipp Hahn, e Stefan Richter.”…””}”(hj3h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h»h³jh´K…hjh²hubeh}”(h]”Œcrediti”ah ]”h"]”Œcrediti”ah$]”h&]”uh1j©hj«h²hh³jh´Kubeh}”(h]”(Œ:perche-la-parola-chiave-volatile-non-dovrebbe-essere-usata”j¨eh ]”h"]”(Œ=perché la parola chiave "volatile" non dovrebbe essere usata”Œit_volatile_considered_harmful”eh$]”h&]”uh1j©hhh²hh³jh´K Œexpect_referenced_by_name”}”jOjsŒexpect_referenced_by_id”}”j¨jsubeh}”(h]”h ]”h"]”h$]”h&]”Œsource”juh1hŒcurrent_source”NŒ current_line”NŒsettings”Œdocutils.frontend”ŒValues”“”)”}”(j®NŒ generator”NŒ datestamp”NŒ source_link”NŒ source_url”NŒ toc_backlinks”Œentry”Œfootnote_backlinks”KŒ sectnum_xform”KŒstrip_comments”NŒstrip_elements_with_classes”NŒ strip_classes”NŒ report_level”KŒ halt_level”KŒexit_status_level”KŒdebug”NŒwarning_stream”NŒ traceback”ˆŒinput_encoding”Œ utf-8-sig”Œinput_encoding_error_handler”Œstrict”Œoutput_encoding”Œutf-8”Œoutput_encoding_error_handler”jyŒerror_encoding”Œutf-8”Œerror_encoding_error_handler”Œbackslashreplace”Œ language_code”Œen”Œrecord_dependencies”NŒconfig”NŒ id_prefix”hŒauto_id_prefix”Œid”Œ dump_settings”NŒdump_internals”NŒdump_transforms”NŒdump_pseudo_xml”NŒexpose_internals”NŒstrict_visitor”NŒ_disable_config”NŒ_source”jŒ _destination”NŒ _config_files”]”Œ7/var/lib/git/docbuild/linux/Documentation/docutils.conf”aŒfile_insertion_enabled”ˆŒ raw_enabled”KŒline_length_limit”M'Œpep_references”NŒ pep_base_url”Œhttps://peps.python.org/”Œpep_file_url_template”Œpep-%04d”Œrfc_references”NŒ rfc_base_url”Œ&https://datatracker.ietf.org/doc/html/”Œ tab_width”KŒtrim_footnote_reference_space”‰Œsyntax_highlight”Œlong”Œ smart_quotes”ˆŒsmartquotes_locales”]”Œcharacter_level_inline_markup”‰Œdoctitle_xform”‰Œ docinfo_xform”KŒsectsubtitle_xform”‰Œ image_loading”Œlink”Œembed_stylesheet”‰Œcloak_email_addresses”ˆŒsection_self_link”‰Œenv”NubŒreporter”NŒindirect_targets”]”Œsubstitution_defs”}”Œsubstitution_names”}”Œrefnames”}”Œrefids”}”j¨]”jasŒnameids”}”(jOj¨jNjKjjjFjCuŒ nametypes”}”(jOˆjN‰j‰jF‰uh}”(j¨j«jKj«jj³jCjuŒ footnote_refs”}”Œ citation_refs”}”Œ autofootnotes”]”Œautofootnote_refs”]”Œsymbol_footnotes”]”Œsymbol_footnote_refs”]”Œ footnotes”]”Œ citations”]”Œautofootnote_start”KŒsymbol_footnote_start”KŒ id_counter”Œ collections”ŒCounter”“”}”…”R”Œparse_messages”]”Œtransform_messages”]”hŒsystem_message”“”)”}”(hhh]”h¼)”}”(hhh]”hŒDHyperlink target "it-volatile-considered-harmful" is not referenced.”…””}”hjãsbah}”(h]”h ]”h"]”h$]”h&]”uh1h»hjàubah}”(h]”h ]”h"]”h$]”h&]”Œlevel”KŒtype”ŒINFO”Œsource”jŒline”Kuh1jÞubaŒ transformer”NŒ include_log”]”ŒHDocumentation/translations/it_IT/process/volatile-considered-harmful.rst”(NNNNt”†”aŒ decoration”Nh²hub.