Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Recensione HONOR Magic V6: spessore record e super batteria. È lui il fold da battere?
Recensione HONOR Magic V6: spessore record e super batteria. È lui il fold da battere?
HONOR Magic V6 è arrivato in Italia a 2.299,90 euro con una promessa precisa: unire 4 mm di spessore da aperto (8,75 mm chiuso nel modello White, 9 mm negli altri colori) a una batteria da 6.660 mAh, la più capiente mai vista su un pieghevole. Lo abbiamo usato per oltre una settimana in versione Red 16/512 GB per capire se lo Snapdragon 8 Elite Gen 5 tiene testa alla concorrenza anche fuori dai benchmark ufficiali
Redmi Pad 2 9.7: ampio display, economico e peso contenuto, ma qualche limite nelle prestazioni
Redmi Pad 2 9.7: ampio display, economico e peso contenuto, ma qualche limite nelle prestazioni
Redmi Pad 2 9.7 punta su un display ampio e fluido, una batteria capace di accompagnare l'uso quotidiano senza ansie da ricarica e un prezzo accessibile, a partire da 179,90 euro per la versione con 64 GB di storage. Lo Snapdragon 6s 4G Gen 2 e i 4 GB di RAM della configurazione più diffusa frenano però chi cerca reattività e multitasking spinto: ecco il bilancio dopo due settimane di prova diretta
Peugeot Polygon Concept: ecco il futuro delle utilitarie
Peugeot Polygon Concept: ecco il futuro delle utilitarie
Polygon è la concept car di Peugeot che mostra il futuro delle soluzioni del segmento B: tra design compatti e innovativi affiancati da dimensioni compatte uno scherzo dalla manovrabilità incredibile per le manovre a bassa velocità
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 19-01-2011, 15: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, 15: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, 16: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, 16: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, 21: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 21:19.
banryu79 è offline   Rispondi citando il messaggio o parte di esso
Old 20-01-2011, 07: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, 08: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, 09: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, 09: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, 11: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, 18: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 HONOR Magic V6: spessore record e super batteria. È lui il fold da battere? Recensione HONOR Magic V6: spessore record e sup...
Redmi Pad 2 9.7: ampio display, economico e peso contenuto, ma qualche limite nelle prestazioni Redmi Pad 2 9.7: ampio display, economico e peso...
Peugeot Polygon Concept: ecco il futuro delle utilitarie Peugeot Polygon Concept: ecco il futuro delle ut...
Reno16 Pro: il compatto di OPPO punta su fotocamera da 200MP e il nuovo Bubble! La recensione Reno16 Pro: il compatto di OPPO punta su fotocam...
 Hisense 55U7SE: tuttofare e accessibile, il MiniLED per film, sport e gioco Hisense 55U7SE: tuttofare e accessibile, il Min...
HP blocca anche le cartucce di inchiostr...
Acquisizione Apple: SigScalr chiude, gli...
Cooler Master HAF II 500 integra le vent...
I musulmani non dovrebbero usare le crip...
AMD Radeon 9000 pronte a sorpassare le N...
Soulframe, il nuovo gameplay chiarisce m...
La Commissione UE presenterà una ...
Niente più eliche: con due ali, i...
Waze si aggiorna con nuove funzioni IA: ...
Oltre 200 economisti ed esperti di IA la...
I migliori produttori del 2026? Facci sa...
Claude Code consuma fino a 33 mila token...
Si chiama Starfire il chip con cui Intel...
Chrome espone l'OS reale dietro ogni ric...
Intel investe altri 5 miliardi di euro p...
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: 00:38.


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