Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Recensione HUAWEI Mate X7: un foldable ottimo, ma restano i soliti problemi
Recensione HUAWEI Mate X7: un foldable ottimo, ma restano i soliti problemi
Mate X7 rinnova la sfida nel segmento dei pieghevoli premium puntando su un design ancora più sottile e resistente, unito al ritorno dei processori proprietari della serie Kirin. L'assenza dei servizi Google e del 5G pesa ancora sull'esperienza utente, ma il comparto fotografico e la qualità costruttiva cercano di compensare queste mancanze strutturali con soluzioni ingegneristiche di altissimo livello
Nioh 3: souls-like punitivo e Action RPG
Nioh 3: souls-like punitivo e Action RPG
Nioh 3 aggiorna la formula Team NINJA con aree esplorabili più grandi, due stili di combattimento intercambiabili al volo (Samurai e Ninja) e un sistema di progressione pieno di attività, basi nemiche e sfide legate al Crogiolo. La recensione entra nel dettaglio su combattimento, build, progressione e requisiti PC
Test in super anteprima di Navimow i220 LiDAR: il robot tagliaerba per tutti
Test in super anteprima di Navimow i220 LiDAR: il robot tagliaerba per tutti
La facilità di installazione e la completa automazione di tutte le fasi di utilizzo, rendono questo prodotto l'ideale per molti clienti. Ecco com'è andata la nostra prova in anteprima
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 19-01-2011, 16:26   #1
nocturnia
Registered User
 
Iscritto dal: Nov 2007
Messaggi: 4
[C#] Multithreading e utilizzo dei Lock. Delucidazioni?

Ciao ragazzi spiego il mio problema!

Ho una applicazione console in C# che opera in multithreading e per questo sono costretto ad utilizzare dei costrutti Lock(nomeoggetto) per lockare momentaneamente porzioni di metodi per evitare che siano accessibili contemporaneamente da più thread allo stesso tempo.

Per instanziare i costrutti di Lock ho operato in questo modo:
- Ho creato vari oggetti dichiarandoli private static (private static object nomeoggetto = new Object() )
- Nei metodi locko un determinato oggetto (ogni lock ha un suo oggetto diverso).

Mi sono però subito reso conto di un problema che accade sui Dictionary e sulle List.
Avendo oggetti di Lock differenti può capitare che se metodo A sta effettuando (se pur lockato) un enumerazione su una Lista ed arriva metodo B (lockato mediante un altro oggetto) e tenta di enumerare sulla stessa Lista, io mi ritrovo con la mia bella eccezione "Collection Was modified".

Quindi ho optato per un altra soluzione:
I metodi che lavorano sulla stessa Lista vengono lockati con oggetti uguali in modo che solo un metodo alla volta possa ottenere il token di lock e svolgere le operazioni al suo interno.

Ora la mia domanda è: quel che sto facendo ed il mio ragionamento sono esatti? O solitamente è buona abitudine lockare UN SOLO oggetto per classe ed utilizzare sempre quello in tutti i metodi??

Non so se mi sono spiegato bene. In tal caso proverò a spiegarmi meglio!

Grazie mille per l'attenzione!
nocturnia è offline   Rispondi citando il messaggio o parte di esso
Old 19-01-2011, 16:56   #2
banryu79
Senior Member
 
L'Avatar di banryu79
 
Iscritto dal: Oct 2007
Città: Padova
Messaggi: 4131
Ciao, non conosco C#, ma so che assomiglia molto a Java.
Invece di usare lock espliciti come stai facendo, non sarebbe meglio usare delle collezioni thread-safe? Lo chiedo perchè appunto in Java ci sono, mi stupirei se non ci fossero anche nel framework .NET...
__________________

As long as you are basically literate in programming, you should be able to express any logical relationship you understand.
If you don’t understand a logical relationship, you can use the attempt to program it as a means to learn about it.
(Chris Crawford)
banryu79 è offline   Rispondi citando il messaggio o parte di esso
Old 19-01-2011, 17:22   #3
tomminno
Senior Member
 
Iscritto dal: Oct 2005
Messaggi: 3306
Se stai usando .Net 4 potresti trovare quello che ti serve in System.Collections.Concurrent
tomminno è offline   Rispondi citando il messaggio o parte di esso
Old 19-01-2011, 17:52   #4
nocturnia
Registered User
 
Iscritto dal: Nov 2007
Messaggi: 4
il fatto è che in questo modo mi tocca riscrivere tutto il codice per sostituire tutti i Dictionary e tutte le List dato che ho provato a fare una semplice sostituzione ma vedo che alcuni attributi di Dictionary non sono più gli stessi per ConcurrentDictionary
nocturnia è offline   Rispondi citando il messaggio o parte di esso
Old 19-01-2011, 22:15   #5
banryu79
Senior Member
 
L'Avatar di banryu79
 
Iscritto dal: Oct 2007
Città: Padova
Messaggi: 4131
Quote:
Originariamente inviato da nocturnia Guarda i messaggi
il fatto è che in questo modo mi tocca riscrivere tutto il codice per sostituire tutti i Dictionary e tutte le List dato che ho provato a fare una semplice sostituzione ma vedo che alcuni attributi di Dictionary non sono più gli stessi per ConcurrentDictionary
Puoi fare quello (dopo aver esaminato bene le classi concorrenti per conoscerle) oppure smazzarti con i lock espliciti, tecnica secondo me più laboriosa ed error-prone (beh, dipende dal livello di granularità della sincronizzazione che uno vuole ottenere; la cosa meno complicata è costringere i thread su un unico lock da aqcuisire e mantenere per tutta la durata di una chiamata ad un metodo, sia in lettura che in scrittura sulla collezione).
Certo, poi dipende da quanto è complesso quello che devi fare.

Per le collezioni ci sarebbe da dire che se vincoli tutti i clienti che operano (per esempio) su una lista a possedere il lock su un singolo oggetto per tutto il tempo della chiamata ad un qualsiasi metodo (come ho detto prima) riesci certamente a garantire la sincronicità degli accessi da parte di più thread, ma solo un thread alla volta può accedere alla lista.

Invece, è probabile che le collezioni concorrenti messe a disposizione dal framework .NET siano molto più performanti, perche basate su meccanismi di sincronizzazione molto più granulari (almeno nel JDK Java è così).
__________________

As long as you are basically literate in programming, you should be able to express any logical relationship you understand.
If you don’t understand a logical relationship, you can use the attempt to program it as a means to learn about it.
(Chris Crawford)

Ultima modifica di banryu79 : 19-01-2011 alle 22:19.
banryu79 è offline   Rispondi citando il messaggio o parte di esso
Old 20-01-2011, 08:45   #6
Kralizek
Senior Member
 
L'Avatar di Kralizek
 
Iscritto dal: Feb 2003
Città: Stockholm (SE)
Messaggi: 1343
Se puoi fare una chiara distinzione tra chi scrive e chi legge, allora puoi usare il Readerwriterlock. Così chi legge non locka, ma chi scrive si (è un filo più complessa di così, leggi doc)

http://msdn.microsoft.com/en-us/libr...riterlock.aspx
Kralizek è offline   Rispondi citando il messaggio o parte di esso
Old 20-01-2011, 09:36   #7
banryu79
Senior Member
 
L'Avatar di banryu79
 
Iscritto dal: Oct 2007
Città: Padova
Messaggi: 4131
Quote:
Originariamente inviato da Kralizek Guarda i messaggi
Se puoi fare una chiara distinzione tra chi scrive e chi legge, allora puoi usare il Readerwriterlock. Così chi legge non locka, ma chi scrive si (è un filo più complessa di così, leggi doc)

http://msdn.microsoft.com/en-us/libr...riterlock.aspx
Sembra che quel tipo di lock permetta di condividere una risorsa in sola lettura da più thread contemporaneamente, mentre in scrittura da un solo thread, e solo se non ci sono altri thread che hanno il lock in lettura.
Da il meglio se (in termini di prestazioni) sulla collezione condivisa ci sono frequenti letture, con sporadiche e veloci scritture.
__________________

As long as you are basically literate in programming, you should be able to express any logical relationship you understand.
If you don’t understand a logical relationship, you can use the attempt to program it as a means to learn about it.
(Chris Crawford)
banryu79 è offline   Rispondi citando il messaggio o parte di esso
Old 20-01-2011, 10:10   #8
nocturnia
Registered User
 
Iscritto dal: Nov 2007
Messaggi: 4
Grazie mille a tutti per l'aiuto, mi sto orientando verso System.Collections.Concurrent che la vedo veramente ottima per quel che mi serve inquanto le operazioni di lettura sono si frequenti ma lo sono altrettanto (e da diversi thread) quelle di scrittura!

Sto iniziando quindi a riprogrammare i miei vecchi Dictionary in ConcurrentDictionary ma mi sono bloccato nel momento in cui mi serviva enumerare gli elementi dell'oggetto dictionary.

Con il vecchio Dictionary avrei fatto:

Dictionary<tKey, tValue>.Enumerator ecc..

ma ora con ConcurrentDictionary non riesco a trovare niente
nocturnia è offline   Rispondi citando il messaggio o parte di esso
Old 20-01-2011, 10:29   #9
banryu79
Senior Member
 
L'Avatar di banryu79
 
Iscritto dal: Oct 2007
Città: Padova
Messaggi: 4131
Qui: http://msdn.microsoft.com/it-it/libr...onarybase.aspx puoi leggere che:
Quote:
...
L'enumerazione di un insieme non è di per sé una procedura thread-safe. Anche se un insieme è sincronizzato, è possibile che venga modificato da altri thread, con conseguente generazione di un'eccezione da parte dell'enumeratore. Per garantire la protezione dei thread durante l'enumerazione, è possibile bloccare l'insieme per l'intera enumerazione oppure intercettare le eccezioni determinate dalle modifiche apportate da altri thread.
Invece qui: http://msdn.microsoft.com/it-it/library/dd287152.aspx puoi consultare la sezione "Metodi di estensione" e cercare un metodo che faccia al caso tuo (mi pare di capire che sono esposti dei metodi che enumerano il dizionario implicitamente, eseguendo per ogni elemento un'azione specificata dal chiamante).

A quale scopo enumeri il dizionario?
Vedi quindi se uno di quei metodi fornisce un servizio che ti permette di ottenerlo senza dover gestire esplicitamente una enumerazione sul dizionario.

Di più non so aiutarti: non conosco C# e .NET
__________________

As long as you are basically literate in programming, you should be able to express any logical relationship you understand.
If you don’t understand a logical relationship, you can use the attempt to program it as a means to learn about it.
(Chris Crawford)
banryu79 è offline   Rispondi citando il messaggio o parte di esso
Old 20-01-2011, 12:07   #10
nocturnia
Registered User
 
Iscritto dal: Nov 2007
Messaggi: 4
Quote:
A quale scopo enumeri il dizionario?
enumero il dizionario per poterne poi scorrere in un while (mediante un movenext() ) gli elementi ed effettuarne dei controlli.

Comunque ti ringrazio provo a dare uno sguardo a quei metodi!
nocturnia è offline   Rispondi citando il messaggio o parte di esso
Old 20-01-2011, 19:49   #11
Kralizek
Senior Member
 
L'Avatar di Kralizek
 
Iscritto dal: Feb 2003
Città: Stockholm (SE)
Messaggi: 1343
un paio di consigli:

1) "salva" il contenuto della collezione in un array con "ToArray()"
2) prova a contenere tutta la logica che deve essere thread safe in un solo posto, così se devi cambiare meccanismo, ti è più facile.

Codice:
var dict = new System.Collections.Concurrent.ConcurrentDictionary<int, string>();
dict.AddOrUpdate(1, "0", (k,ov) => "Hello world");
dict.AddOrUpdate(1, "0", (k,ov) => "Hello world");

var array = dict.ToArray();
Kralizek è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


Recensione HUAWEI Mate X7: un foldable ottimo, ma restano i soliti problemi Recensione HUAWEI Mate X7: un foldable ottimo, m...
Nioh 3: souls-like punitivo e Action RPG Nioh 3: souls-like punitivo e Action RPG
Test in super anteprima di Navimow i220 LiDAR: il robot tagliaerba per tutti Test in super anteprima di Navimow i220 LiDAR: i...
Dark Perk Ergo e Sym provati tra wireless, software via browser e peso ridotto Dark Perk Ergo e Sym provati tra wireless, softw...
DJI RS 5: stabilizzazione e tracking intelligente per ogni videomaker DJI RS 5: stabilizzazione e tracking intelligent...
Reddit punterà sull'AI per miglio...
Samsung ha obiettivi molto ambiziosi per...
I produttori non faranno sconti sulle me...
Ubisoft potrebbe cedere pezzi se il pian...
Qualcomm potrebbe utilizzare una tecnolo...
Starfield per Nintendo Switch 2 potrebbe...
Un MacBook Pro a -300€, i MacBook Air M4...
Amazon abbassa i prezzi sugli iPhone: sc...
Amazon, ancora sconti sugli smartphone A...
iPhone Air 2 'riciclerà' alcuni c...
Offerta Amazon da non perdere: lo speake...
Nioh 3 debutta alla grande su Steam: pri...
Al centro della Via Lattea ci potrebbe e...
Elon Musk ora guarda alla Luna: SpaceX p...
La Cina ha lanciato nuovamente lo spazio...
Chromium
GPU-Z
OCCT
LibreOffice Portable
Opera One Portable
Opera One 106
CCleaner Portable
CCleaner Standard
Cpu-Z
Driver NVIDIA GeForce 546.65 WHQL
SmartFTP
Trillian
Google Chrome Portable
Google Chrome 120
VirtualBox
Tutti gli articoli Tutte le news Tutti i download

Strumenti

Regole
Non Puoi aprire nuove discussioni
Non Puoi rispondere ai messaggi
Non Puoi allegare file
Non Puoi modificare i tuoi messaggi

Il codice vB è On
Le Faccine sono On
Il codice [IMG] è On
Il codice HTML è Off
Vai al Forum


Tutti gli orari sono GMT +1. Ora sono le: 23:46.


Powered by vBulletin® Version 3.6.4
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Served by www3v