Vydělávej až 160.000 Kč měsíčně! Akreditované rekvalifikační kurzy s garancí práce od 0 Kč. Více informací.
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.

Diskuze: C# - Je statická třída thread safe?

Aktivity
Avatar
Honza
Člen
Avatar
Honza:24.10.2016 12:17

Ahoj, vytvářím si v C# třídu pro import dat z excelu. Můj požadavek je ten, že třídě předám cestu k souboru a název listu (nebo jeho pořadové číslo) a třída mi vrátí data ve formě datatable. Pro načítání dat samotných používám closedXML. Potud vše ok, funguje to bez problémů. Vzhledem k tomu že jen volám funkci která vrací data (třída v sobě nemá žádné proměnné nebo vlastnosti) označil jsem třídu jako static (příjde mi zbytečné vytvářet vždy novou instanci). Ale napadlo mě, bude tato třída thread safe? Zkoušel jsem to testovat a všechno vypadá ok, ale stejně.

Implementace je následující:

public static class ExcelUtil
{

        // Import podle názvu listu
        public static DataTable ImportDataFromFile(string fullPath, string sheetName)
        {
            XLWorkbook workbook = new XLWorkbook(fullPath); // otevření sešitu
            IXLWorksheet worksheet = workbook.Worksheet(sheetName); // získání listu
            return ImportData(worksheet); // import dat
        }


        /// Import podle pořadového čísla listu
        public static DataTable ImportDataFromFile(string fullPath, int sheetPosition)
        {
            XLWorkbook workbook = new XLWorkbook(fullPath); // otevření sešitu
            IXLWorksheet worksheet = workbook.Worksheet(sheetPosition); // získání listu
            return ImportData(worksheet); // import dat
        }


        // Samotný import dat
        private static DataTable ImportData(IXLWorksheet worksheet)
        {
            DataTable result= new DataTable(); // vytvoření výsledné datatable
            IXLRange dataRange = worksheet.RangeUsed(); // získání oblasti dat

            // zde plním datatable daty
            // ...
            // ...

            return result=
        }

}

Napadlo mě totiž zda nemůže nasta problém při zavolání privátní metody ImportData které předávám sešit. Zda se to v tuto chvíli nemůže teoreticky "promíchat". Že by metoda vrátila výsledek který by náležel jinému vláknu a naopak. Situaci kdy by se více vláken pokoušel číst z jednoho souboru můžeme v tuto chvíli zanedbat.

Díky za názory

Editováno 24.10.2016 12:18
Odpovědět
24.10.2016 12:17
Snadnou cestou se daleko nedostanete, je tam velká tlačenice...
Avatar
Petr Čech
Tvůrce
Avatar
Odpovídá na Honza
Petr Čech:24.10.2016 18:32

Nepřistupuje k žádným proměnným, takže je thread-safe ;)

Akceptované řešení
+20 Zkušeností
+2,50 Kč
Řešení problému
Nahoru Odpovědět
24.10.2016 18:32
the cake is a lie
Avatar
Honza
Člen
Avatar
Odpovídá na Petr Čech
Honza:24.10.2016 21:28

Přesně tohle jsem chtěl slyšet, děkuji ;)

Nahoru Odpovědět
24.10.2016 21:28
Snadnou cestou se daleko nedostanete, je tam velká tlačenice...
Avatar
Odpovídá na Petr Čech
Marian Benčat:25.10.2016 0:05

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 ;-)

Nahoru Odpovědět
25.10.2016 0:05
Totalitní admini..
Avatar
Honza
Člen
Avatar
Odpovídá na Marian Benčat
Honza:25.10.2016 8:07

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.

Nahoru Odpovědět
25.10.2016 8:07
Snadnou cestou se daleko nedostanete, je tam velká tlačenice...
Avatar
Odpovídá na Honza
Marian Benčat:25.10.2016 14:54

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.

Nahoru Odpovědět
25.10.2016 14:54
Totalitní admini..
Avatar
Petr Čech
Tvůrce
Avatar
Odpovídá na Marian Benčat
Petr Čech:25.10.2016 15:55

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á.

Editováno 25.10.2016 15:57
Nahoru Odpovědět
25.10.2016 15:55
the cake is a lie
Avatar
Marian Benčat:26.10.2016 0:04

já neřekl ani slovo o souboru. Stačí aby nějaká knihovna co on používá, používala nevhodně singleton a je hotovo.

Nahoru Odpovědět
26.10.2016 0:04
Totalitní admini..
Avatar
Marian Benčat:26.10.2016 0:19

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.write­line(a.getCou­nter());
}

Presto ocividne neni kod threadsafe

Nahoru Odpovědět
26.10.2016 0:19
Totalitní admini..
Avatar
Odpovídá na Petr Čech
Marian Benčat:27.10.2016 1:07

bump, zapomnel jsem oznacit.

Nahoru Odpovědět
27.10.2016 1:07
Totalitní admini..
Avatar
Petr Čech
Tvůrce
Avatar
Odpovídá na Marian Benčat
Petr Čech:27.10.2016 13:48

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á...

Nahoru Odpovědět
27.10.2016 13:48
the cake is a lie
Avatar
Honza
Člen
Avatar
Honza:27.10.2016 13:50

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í.

Nahoru Odpovědět
27.10.2016 13:50
Snadnou cestou se daleko nedostanete, je tam velká tlačenice...
Avatar
Odpovídá na Honza
Marian Benčat:27.10.2016 14:36

@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.

Nahoru Odpovědět
27.10.2016 14:36
Totalitní admini..
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 13 zpráv z 13.