2010-05-09 14 views
12

funziona con 2 fili diversi:
sicurezza del filetto in C# array

  • una lettura da un C# array (ad esempio dalla prima posizione),
  • e un altro crei allo stesso C# array ma soltanto al posizione diversa (ad esempio l'ultima posizione)

è thread sicuro o no?
(E intendo qui senza bloccare né leggere né scrivere)

risposta

8

Questo caso particolare è sicuro, sì.

Leggere e scrivere su parti diverse di un array non interferisce con le altre operazioni.

Tuttavia, la lettura e la scrittura nella stessa posizione può dare problemi, a seconda del tipo di elemento, e la dimensione degli elementi.

+1

Finché tali elementi sono nelle parole di CPU separate – Stewart

+0

+1 Mai pensato che questo sia threadsafe, ma capisco il motivo per cui è. Grazie! –

+0

È importante considerare quando si utilizzano algoritmi lock-free che ciò che si pensa come "la stessa posizione" non è la stessa cosa di quella che la (e) CPU (e) pensa come la stessa posizione. La visualizzazione della memoria della CPU è molto diversa dai linguaggi di visualizzazione come C ci forniscono i byte in cui occupano gli indirizzi. Su alcune architetture di CPU (in particolare ARM, Power) su alcuni tipi di dati anche questo potrebbe non essere sicuro – Stewart

5

Per farla breve: sì. Finché è in due posizioni diverse, è un'operazione sicura.

C'era un discussion about this poco fa, ha alcune informazioni utili se siete curiosi.

+0

+1 Non ho mai pensato che fosse sicuro, ma capisco perché lo è. Grazie! –

7

Non sono sicuro che questo sia sicuro. Immagina di avere un byte []. Questi byte sono strettamente imballati nella memoria. Ora, se si modificano questi byte, il compilatore può coalizzare alcune delle scritture per eseguire operazioni di scrittura di modifica della lettura in formato word (32 bit). Su alcune CPU, ad esempio ARM, questo è l'unico tipo di istruzione che modifica la memoria del compilatore. Ciò è particolarmente utile se si modifica più di un byte alla volta. Anche la CPU può fare la stessa cosa. Può anche riordinare cose senza che tu ne sia a conoscenza. Di fronte a questo tipo di ottimizzazione è possibile che un thread legga memoria adiacente per vedere modifiche parziali. Normalmente non si vede questo tipo di effetto perché l'allocatore di heap è gentile con te e ti dà sempre una memoria che è almeno allineata a parole.

+1

+1: Secondo me questa è la migliore risposta. È sempre meglio essere scettici sugli idiomi di thread free lock. Posso pensare a tutti i tipi di problemi della barriera di memoria che potrebbero causare problemi anche se i thread lavoravano con diverse posizioni di array. Semplicemente non ci sono abbastanza informazioni fornite nella domanda per dare una risposta definitiva. –