abclinuxu.cz AbcLinuxu.cz itbiz.cz ITBiz.cz HDmag.cz HDmag.cz abcprace.cz AbcPráce.cz
AbcLinuxu hledá autory!
Inzerujte na AbcPráce.cz od 950 Kč
Rozšířené hledání
×

    dnes 01:44 | Zajímavý projekt

    Na redditu byly publikovány zajímavé QR kódy vygenerované pomocí Stable Diffusion. Přehled použitého softwaru v článku na Ars Technica.

    Ladislav Hagara | Komentářů: 0
    včera 15:11 | Nová verze

    Byl vydán Mozilla Firefox 114.0. Přehled novinek v poznámkách k vydání, poznámkách k vydání pro firmy a na stránce věnované vývojářům. Nově jsou také na Linuxu podporovány USB FIDO2/WebAuthn bezpečnostní klíče. WebTransport je ve výchozím stavu povolen. Řešeny jsou rovněž bezpečnostní chyby. Nový Firefox 114 je již k dispozici také na Flathubu a Snapcraftu.

    Ladislav Hagara | Komentářů: 0
    včera 11:44 | Nová verze

    Byla vydána červnová aktualizace aneb verze 2023.06-1 linuxové distribuce OSMC (Open Source Media Center). Z novinek lze zdůraznit povýšení verze multimediálního centra Kodi na 20. Na léto je plánováno představení nového vlajkového zařízení Vero, jež nahradí Vero 4K +.

    Ladislav Hagara | Komentářů: 0
    včera 11:11 | Pozvánky

    Už zítra 7. června od 17 hodin proběhne SUSE Czech Open House 2023 aneb den otevřených dveří pražské pobočky SUSE. Těšit se lze na komentovanou prohlídku nebo přednášku o spotřebě procesorů.

    Ladislav Hagara | Komentářů: 0
    5.6. 22:33 | IT novinky

    Na vývojářské konferenci Applu WWDC23 byla představena řada novinek (cz): brýle Apple Vision Pro, MacBook Air 15” s čipem M2, Mac Studio s čipem M2 Max nebo M2 Ultra, Mac Pro s čipem M2 Ultra, iOS 17, iPadOS 17, macOS Sonoma, watchOS 10, …

    Ladislav Hagara | Komentářů: 2
    5.6. 21:55 | Pozvánky

    Chystá se poslední jarní Virtuální Bastlírna. Nachystejte si ledové kávy, mojita a vodní chladiče a pojďte se se strahovskými bastlíři pobavit o technice a bastlení! Ptáte se, co mají bastlíři za novinky? Například se ukázalo, že OLED s SSD1306 ve skutečnosti nejsou nutně jen černobílé. Vyšla také nová verze KiCADu včetně betaverze pluginu pro tvorbu databázových knihoven pro KiCAD v InvenTree a na internetu se objevil USB

    … více »
    bkralik | Komentářů: 1
    5.6. 21:22 | IT novinky

    6. červen je dnem za skutečný internet (neboli Světový den IPv6). Již tradiční příležitost urgovat svého ISP, kdy zavede do sítě IPv6, ale také příležitost šířit osvětu i mezi netechnické uživatele. V současnosti má IPv6 v ČR jen cca 20 % uživatelů (podle statistik společností Akamai a Google).

    xHire | Komentářů: 0
    5.6. 15:44 | Pozvánky

    Festival plný workshopů, interaktivních činností a především nadšených a zvídavých lidí Maker Faire Prague 2023 proběhne o víkendu 10. a 11. června na Výstavišti Praha.

    Ladislav Hagara | Komentářů: 0
    5.6. 11:44 | Nová verze

    Byla vydána verze 8.18 z Debianu vycházející linuxové distribuce DietPi pro (nejenom) jednodeskové počítače. Přehled novinek v poznámkách k vydání.

    Ladislav Hagara | Komentářů: 0
    5.6. 11:33 | Zajímavý projekt

    Projekty Blink a Blinkenlights dospěly do verze 1.0. Jedná se o x86-64-linux emulátor a jeho TUI nadstavbu sloužící jako debugger. Blink je v porovnání s qemu-x86_64 menší a rychlejší.

    Ladislav Hagara | Komentářů: 0
    Twitter (nejen pro příležitostné čtení)
     (89%)
     (2%)
     (9%)
    Celkem 156 hlasů
     Komentářů: 6, poslední včera 09:40
    Rozcestník

    Dotaz: pthread_mutex_init ve strukture

    31.7.2014 11:37 pou | skóre: 18
    pthread_mutex_init ve strukture
    Přečteno: 443×
    Dobrý den, píšu si jeden takový malinky program v C.

    V tom programu definuji strukturu:
    struct HANDLER{
        MEMORY * memory;
    };
    
    
    struct MEMORY{
        CMD action;
        pthread_mutex_t mutex;
        char * Buffer;
        int start;
        int stop;
    };
    
    a k ni inicializacni funkci:
    HANDLER * init_handler(){
        HANDLER * handler;
        handler=new HANDLER;
        handler->memory=new MEMORY;
        handler->memory->Buffer=new char [BUFFER_SIZE];
        handler->memory->start=0;
        handler->memory->stop=0;
        pthread_mutex_init(&handler->memory->mutex, NULL);
        handler->memory->action=READY;
        return handler;
    }
    
    Pomocí debugu jsem zjistil, že ukazatel handler->memory->Buffer spravne ukazuje na nejake misto v pameti (konkretne 0x6126D0) ale po inicializaci funkci pthread_mutex_init se změní adresa na kterou ukazatel Buffer ukazuje na 0X00. Nevíte prosím někdo co dělám špatně? Místo pro pthread_mutex_t(32B) ve strukture je ale funkce pthread_mutex_init z nějakého důvodu přepíše i několik B za zvím místem!

    Všem moc díky!

    Řešení dotazu:


    Odpovědi

    31.7.2014 12:09 logik
    Rozbalit Rozbalit vše Re: pthread_mutex_init ve strukture
    Zkompilovals to s valgrindem (nebo něčím podobným)? Pokud ne, tak s tím bych začal...
    31.7.2014 15:02 pou | skóre: 18
    Rozbalit Rozbalit vše Re: pthread_mutex_init ve strukture
    Valgrid je dobra rada, ale v podstatě mi řekl jen to co jsem věděl - definitně ztraceny blok paměti na řadku, kde alokuji pamět pro buffer (new char [BUFF_SIZE).

    31.7.2014 15:55 Sten
    Rozbalit Rozbalit vše Re: pthread_mutex_init ve strukture
    Pokud je to v C, mělo by tam být malloc místo new.

    Neběží to na 64-bitovém systému? Tam by měl pthread_mutext_t mít 40 bajtů, takže problém by byl nejspíš s includy nebo nějakými define.
    31.7.2014 17:08 pou | skóre: 18
    Rozbalit Rozbalit vše Re: pthread_mutex_init ve strukture
    Někde jsem se docetl, že pokud se ve struktuře objevuje např std::string není dobre volat na alokaci struktury malloc, protoze se nezavola prislusny konstruktor->proto volam radeji new - je pravda ze u bufferu muzu volat i malloc ale to je asi jedno.

    Ano systém je 64b. Jak napravit ty špatny includy??
    31.7.2014 17:22 Sten
    Rozbalit Rozbalit vše Re: pthread_mutex_init ve strukture
    std::string ani konstruktory nejsou v C, jen v C++. V C++ bych nedělal žádné takovéhle struktury, ale pořádné objekty.

    Jakým způsobem to kompilujete?
    31.7.2014 20:13 benn | skóre: 18
    Rozbalit Rozbalit vše Re: pthread_mutex_init ve strukture
    Píšeš, že je to v C, tak zkusit nahradit new za malloc. Zda to dělá podobnou neplechu. U malloc vyloženě musíš určit velikosti. Pak se uvidí
    
    HANDLER * handler;
    handler                 = (HANDLER*) malloc(sizeof(HANDLER));
    handler->memory         = (MEMORY*)  malloc(sizeof(MEMORY));
    handler->memory->Buffer = (char*)    malloc(BUFFER_SIZE);
    
    
    Pak snad prohodit ty definovaný struktury.
    1.8.2014 07:58 DK
    Rozbalit Rozbalit vše Re: pthread_mutex_init ve strukture
    malloc(BUFFER_SIZE * sizeof(char))
    1.8.2014 08:46 Jakub Galgonek | skóre: 3
    Rozbalit Rozbalit vše Re: pthread_mutex_init ve strukture
    To není nutné, sizeof(char) je vždy jedna.
    Jardík avatar 3.8.2014 11:27 Jardík | skóre: 40 | blog: jarda_bloguje
    Rozbalit Rozbalit vše Re: pthread_mutex_init ve strukture
    Stejně tak přetypovávat jak kokot z void* na cokoliv*.
    Věřím v jednoho Boha.
    1.8.2014 08:13 rastos | skóre: 62 | blog: rastos
    Rozbalit Rozbalit vše Re: pthread_mutex_init ve strukture
    Ten kód v povodnej otázke nie je C, ale C++. C kompilátor by mu nadával na kľúčové slovo "new" na použitie "MEMORY" miesto "struct MEMORY" v definícii štruktúry HANDLER a podobne. S C kompilátorom by sa nedostal k tomu, aby to debugoval a videl kam ukazuje Buffer. Pri kompilovaní s C++ kompilácia prejde, ale ani tam nie je žiaden problém s prepisovaním pamäte.

    Tak, ako to je napísané, je hodnota Buffer po vykonaní pthread_mutex_init() nedotknutá. Zádrhel je niekde inde. Niečo, čo tu v tom kóde nevidíme, tam urobí bordel.
    3.8.2014 22:45 Michal Kubeček | skóre: 72 | Luštěnice
    Rozbalit Rozbalit vše Re: pthread_mutex_init ve strukture
    Zádrhel je niekde inde. Niečo, čo tu v tom kóde nevidíme, tam urobí bordel.

    Souhlasím. Aby bylo možné určit, kde je problém, chtělo by to kompletní zdroják(y) (stačí minimalistický testcase, kde se to projevuje) a informaci, jak se to přesně překládalo a linkovalo (a na jaké architektuře).

    4.8.2014 12:54 pou | skóre: 18
    Rozbalit Rozbalit vše Re: pthread_mutex_init ve strukture
    kus zdrojáku je v úvodním příšpěvku, jinde už jen volám tuto funkci a pristupuji k té struktuře, problém je (jak jsem psal) v té inicializační funkci, že inicializace mutexu přepíše ukazatel na tu přidělenou pamět.

    A v tomto případě si myslím, že je jedno jestli tu pamět získám pomocí malloc nebo new.

    kompiluji pomocí:

    g++ -c -m64 -pipe -g -Wall -W -I/usr/share/qt4/mkspecs/linux-g++-64 -o test.o ../test.cpp

    jinak sizeof mutexu vraci 32b

    Honza
    4.8.2014 12:58 pou | skóre: 18
    Rozbalit Rozbalit vše Re: pthread_mutex_init ve strukture
    OMLOUVAM SE!!! jinak sizeof(pthread_mutex_t) vraci 40

    4.8.2014 13:12 Jakub Galgonek | skóre: 3
    Rozbalit Rozbalit vše Re: pthread_mutex_init ve strukture
    To s tím minimalistickým testcasem je ale dobrá rada. Při jeho vytváření dost možmá tu chybu najdeš sám. A i kdyby ne, tak ti pak více více lidí může pomoci s jejím hledáním.
    4.8.2014 13:30 Michal Kubeček | skóre: 72 | Luštěnice
    Rozbalit Rozbalit vše Re: pthread_mutex_init ve strukture
    kus zdrojáku je v úvodním příšpěvku, jinde už jen volám tuto funkci a pristupuji k té struktuře, problém je (jak jsem psal) v té inicializační funkci, že inicializace mutexu přepíše ukazatel na tu přidělenou pamět.

    A právě proto je potřeba vidět celý zdroják, protože pravděpodobné vysvětlení je, že na různých místech se pracuje s různým layoutem některé z těch struktur. Kvůli tomu by bylo dobré vidět celý soubor (resp. celé soubory, pokud to není v jednom).

    A v tomto případě si myslím, že je jedno jestli tu pamět získám pomocí malloc nebo new.

    To nepopírám. Problém by byl, kdybyste alokoval jedním a zkusil uvolnit druhým, ale to by se samozřejmě projevovalo jinak.

    kompiluji pomocí:

    g++ -c -m64 -pipe -g -Wall -W -I/usr/share/qt4/mkspecs/linux-g++-64 -o test.o ../test.cpp
    

    Pokud používáte pthreads (což podle toho mutexu používáte), mělo by se všechno kompilovat s -pthread

    4.8.2014 13:48 rastos | skóre: 62 | blog: rastos
    Rozbalit Rozbalit vše Re: pthread_mutex_init ve strukture
    Příloha:
    Test case je v prílohe. A jeho výstupom je:
    allocated       0x82a3048
    before pthread_mutex_init()     0x82a3048
    after pthread_mutex_init()      0x82a3048
    after init_handler()    0x82a3048
    4.8.2014 14:13 Michal Kubeček | skóre: 72 | Luštěnice
    Rozbalit Rozbalit vše Re: pthread_mutex_init ve strukture
    To ovšem znamená, že ten testcase nedemonstruje ten problém…
    4.8.2014 14:50 rastos | skóre: 62 | blog: rastos
    Rozbalit Rozbalit vše Re: pthread_mutex_init ve strukture
    To znamená, že problém nie je v tom kóde, ktorý tu vidíme.
    4.8.2014 15:01 Michal Kubeček | skóre: 72 | Luštěnice
    Rozbalit Rozbalit vše Re: pthread_mutex_init ve strukture
    Aha, pardon, nějak jsem automaticky předpokládal, že ten testcase sem dával tazatel. :-)
    4.8.2014 15:26 pou | skóre: 18
    Rozbalit Rozbalit vše Re: pthread_mutex_init ve strukture
    Takže jsem zkusil testcase.cpp a vse funguje, patral jsem kde je tedy problem, nasel - přiznávám, je to moje blbost :-/.

    Problém byl v tom, že program kompiluji i pro ARM, a tak mám nastavené u vývojového prostředí cesty i k tem ARM knihovnám -> ted kdyz muj kod zkompiluji se správnými cestami vse funguje bez problému.

    Sam bych asi na tuto "moji hloupost" nepřišel.

    Děkuji!! Vsem
    1.8.2014 14:18 Radek Isa | skóre: 13
    Rozbalit Rozbalit vše Re: pthread_mutex_init ve strukture
    pthread_mutex_init(&(handler->memory->mutex), NULL); nevim ktery operator ma prednost &a->b tak to skus napsat &(a->b)
    pavlix avatar 1.8.2014 15:49 pavlix | skóre: 54 | blog: pavlix
    Rozbalit Rozbalit vše Re: pthread_mutex_init ve strukture
    Pokud C/C++ denně nepoužíváš, stačí se podívat na tabulku operátorů dle priority a nemusí se pak ani upravovat kód ani psát takovéto příspěvky.
    Já už tu vlastně ani nejsem. Abclinuxu umřelo.
    3.8.2014 22:39 Michal Kubeček | skóre: 72 | Luštěnice
    Rozbalit Rozbalit vše Re: pthread_mutex_init ve strukture
    Doplnil bych, že ve většině případů funguje pravidlo, že autoři C se obvykle řídili zdravým rozumem a tím, co je praktičtější, takže je např. na rozdíl od autora Pascalu nenapadlo dát porovnávání nižší prioritu než logickým spojkám, aby se "a < b && b < c" muselo závorkovat. V tomto případě nemá smysl, aby "&a->b" znamenalo "(&a)->b", protože to lze jednoduše zapsat jako "a.b".
    pavlix avatar 3.8.2014 22:47 pavlix | skóre: 54 | blog: pavlix
    Rozbalit Rozbalit vše Re: pthread_mutex_init ve strukture
    +1
    Já už tu vlastně ani nejsem. Abclinuxu umřelo.

    Založit nové vláknoNahoru

    Tiskni Sdílej: Linkuj Jaggni to Vybrali.sme.sk Google Del.icio.us Facebook

    ISSN 1214-1267   www.czech-server.cz
    © 1999-2015 Nitemedia s. r. o. Všechna práva vyhrazena.