€•‚sŒ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Œ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”…””}”(hhóhžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hńhhîhŸŒ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”…””}”(hjhžhhŸNh Nubah}”(h]”h ]”(hÁŒstd”Œstd-ref”eh"]”h$]”h&]”uh1hľhj ubah}”(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&]”uh1jhhîubeh}”(h]”h ]”h"]”h$]”h&]”uh1hěhŸjh Khhéhžhubhí)”}”(hhh]”(hň)”}”(hŒ Translator”h]”hŒ Translator”…””}”(hj?hžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hńhj<hŸjh Kubj)”}”(hŒ)Federico Vaga ”h]”h¨)”}”(hŒ(Federico Vaga ”h]”(hŒFederico Vaga <”…””}”(hjQhžhhŸNh NubhŒ reference”“”)”}”(hŒfederico.vaga@vaga.pv.it”h]”hŒfederico.vaga@vaga.pv.it”…””}”(hj[hžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”Œrefuri”Œmailto:federico.vaga@vaga.pv.it”uh1jYhjQubhŒ>”…””}”(hjQhžhhŸNh Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1h§hŸjh KhjMubah}”(h]”h ]”h"]”h$]”h&]”uh1jhj<ubeh}”(h]”h ]”h"]”h$]”h&]”uh1hěhŸ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 ”…””}”(hjđhžhhŸNh Nubjł)”}”(hŒ *volatile*”h]”hŒvolatile”…””}”(hjřhžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j˛hjđubhXŞ è 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.”…””}”(hjđhž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 ”…””}”(hjhžhhŸNh Nubjł)”}”(hŒ *volatile*”h]”hŒvolatile”…””}”(hjhžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j˛hjubhŒů, 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 ”…””}”(hjhžhhŸNh Nubjł)”}”(hŒ *volatile*”h]”hŒvolatile”…””}”(hj*hžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j˛hjubhŒ. Se vi sembra che ”…””}”(hjhžhhŸNh Nubjł)”}”(hŒ *volatile*”h]”hŒvolatile”…””}”(hj<hžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j˛hjubhŒ… sia comunque necessario, ci dev’essere quasi sicuramente un baco da qualche parte. In un pezzo di codice kernel scritto a dovere, ”…””}”(hjhžhhŸNh Nubjł)”}”(hŒ *volatile*”h]”hŒvolatile”…””}”(hjNhžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j˛hjubhŒ( può solo servire a rallentare le cose.”…””}”(hjhž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:”…””}”(hjfhž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);”…””}”hjvsbah}”(h]”h ]”h"]”h$]”h&]”Œ xml:space”Œpreserve”uh1jthŸ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”…””}”(hjňhž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 K