Diskuze: C# - Je statická třída thread safe?
V předchozím kvízu, Test znalostí C# .NET online, jsme si ověřili nabyté zkušenosti z kurzu.
Člen
Zobrazeno 13 zpráv z 13.
//= Settings::TRACKING_CODE_B ?> //= Settings::TRACKING_CODE ?>
V předchozím kvízu, Test znalostí C# .NET online, jsme si ověřili nabyté zkušenosti z kurzu.
Nepřistupuje k žádným proměnným, takže je thread-safe
ja bych byl asi ohledne toho tvrzeni opatrny.. ja tam vidim praci se soubory.. To,, ze je trida statická neříká nic o tom, jestli je thread safe, nebo není.. stejně tak ani to, zda přistupuje, nebo nepřistupuje k nějakým proměnným..
Tady bych odpověděl tak, že ta třída je thread safe, pokud to co se používá uvnitř je thread safe
Díky za reakci Ohledně těch souborů, jak jsem psal zanedbal bych případ kdy se dvě vlákna pokoušejí přistupovat k jednomu souboru, protože tam mi je jasný že to musím ošetřit nějak jinak. Jde mi vyloženě o tu třídu, abych se mohl spolehnout že se mi nevrátí data z jiného souboru než očekávám.
a to je právě ono.. nejde jen o soubory.. jde o to, jestli treba vyvojar te knihovni neni mental a nepouziva tam treba singleton jako antipattern..
Todle bohužel nemáš šanci moc zjsitit a musíš do dokumentace knihovni zjistit, jeslti je threadsafe.. Coz z toho kodu by byt mela,.. ale proste nikdy nevis, co programator vymyslel.. staci tak malo, aby to thread safe nebylo.
To, že nelze přistupovat z více objektů/metod a pod. k souboru nemá nic společného s tím, jestli je to thread-safe. Zkrátka se jedná o rozličné pojmy. Thread-safe znamená, že nedojde k žádným neočekávaným vnitřním chybám v důsledku např. toho, že není nějaká operace atomární ačkoliv by měla. To, že vyhazuje jiné zcela legitimní vyjímky se do toho nepočítá.
já neřekl ani slovo o souboru. Stačí aby nějaká knihovna co on používá, používala nevhodně singleton a je hotovo.
ah tak ano.. v prvnim prispevku jsem bohuezl nestastne pouzil priklad se
soubory.. OK, zapomente na soubory. To s tim nesouvisi.
//3rd party
class Foo() {
static int counter = 0;
public getCounter() => Foo.counter;
public increment() => Foo.counter++;
}
Moje "thread safe knihovna"
//kod spusteny ve vice threadech.. nepredavaji se zadne parametry, vytvari se
nova instance Foo, ktera neni sdilena.
var a = new Foo();
for(;;) {
a.Increment();
console.writeline(a.getCounter());
}
Presto ocividne neni kod threadsafe
Stále nevidím problém v tom původním kódu, ty tam máš statickou proměnnou counter, a ta třída zcela určitě thread-safe není, ale Honza nedělá...
Abych se vrátil k mé třídě. Pokud není knihovna třetí strany kterou používám thread safe, tak moje třída není thread safe, to je celkem jasné. Ale pokud to chápu dobře, tak v tomto případě by na tom nemuselo mít vliv to, jestli je moje třída statická nebo ne. Protože pokud je v použité knihovně používán např. singleton, budu mít stejný problém se statikou i bez ní.
@czubehead honza, ne - ale treba ta knihovna co on pouziva ano. Cele co chci rict je to, ze knihovna je threadsafe POUZE (nutne - ne dostacujici pravidlo), pokud jsou knihovny které používá také thread safe.. Tedy z toho kódu co poskytl nelze na 100% říci, že je to thread safe, pokud nemá v dokumentaic napsáno "TATO KNIHOVNA JE THREADSAFE".
A to už tu vůbec nemluvím o něčem složitějším typu ConfigureAwait() u knihoven..
Nechme to být...
Honza:
Presne tak.. Pokud mam odpovedet na otazku v nazvu:
C# - Je statická třída thread safe
Tak odpovím, že na to takto nelze odpovědět.
Zobrazeno 13 zpráv z 13.