abclinuxu.cz AbcLinuxu.cz itbiz.cz ITBiz.cz HDmag.cz HDmag.cz abcprace.cz AbcPráce.cz
Inzerujte na AbcPráce.cz od 950 Kč
Rozšířené hledání
×
    dnes 21:55 | Nová verze

    Byl vydán Fedora Asahi Remix 40, tj. linuxová distribuce pro Apple Silicon vycházející z Fedora Linuxu 40.

    Ladislav Hagara | Komentářů: 1
    dnes 20:22 | IT novinky

    Představena byla služba Raspberry Pi Connect usnadňující vzdálený grafický přístup k vašim Raspberry Pi z webového prohlížeče. Odkudkoli. Zdarma. Zatím v beta verzi. Detaily v dokumentaci.

    Ladislav Hagara | Komentářů: 0
    dnes 12:55 | Nová verze

    Byla vydána verze R14.1.2 desktopového prostředí Trinity Desktop Environment (TDE, fork KDE 3.5). Přehled novinek v poznámkách k vydání, podrobnosti v seznamu změn.

    JZD | Komentářů: 0
    včera 18:55 | IT novinky

    Dnešním dnem lze již také v Česku nakupovat na Google Store (telefony a sluchátka Google Pixel).

    Ladislav Hagara | Komentářů: 10
    včera 18:33 | IT novinky

    Apple představil (keynote) iPad Pro s čipem Apple M4, předělaný iPad Air ve dvou velikostech a nový Apple Pencil Pro.

    Ladislav Hagara | Komentářů: 2
    včera 17:11 | Nová verze

    Richard Biener oznámil vydání verze 14.1 (14.1.0) kolekce kompilátorů pro různé programovací jazyky GCC (GNU Compiler Collection). Jedná se o první stabilní verzi řady 14. Přehled změn, nových vlastností a oprav a aktualizovaná dokumentace na stránkách projektu. Některé zdrojové kódy, které bylo možné přeložit s předchozími verzemi GCC, bude nutné upravit.

    Ladislav Hagara | Komentářů: 0
    včera 13:44 | Komunita

    Free Software Foundation zveřejnila ocenění Free Software Awards za rok 2023. Vybráni byli Bruno Haible za dlouhodobé příspěvky a správu knihovny Gnulib, nováček Nick Logozzo za front-end Parabolic pro yt-dlp a tým Mission logiciels libres francouzského státu za nasazování svobodného softwaru do praxe.

    Fluttershy, yay! | Komentářů: 0
    včera 13:11 | IT novinky

    Před 10 lety Microsoft dokončil akvizici divize mobilních telefonů společnosti Nokia a pod značkou Microsoft Mobile ji zanedlouho pohřbil.

    Ladislav Hagara | Komentářů: 2
    6.5. 21:33 | Komunita

    Fedora 40 release party v Praze proběhne v pátek 17. května od 18:30 v prostorách společnosti Etnetera Core na adrese Jankovcova 1037/49, Praha 7. Součástí bude program kratších přednášek o novinkách ve Fedoře.

    Ladislav Hagara | Komentářů: 5
    6.5. 21:11 | IT novinky

    Stack Overflow se dohodl s OpenAI o zpřístupnění obsahu Stack Overflow pro vylepšení OpenAI AI modelů.

    Ladislav Hagara | Komentářů: 1
    Podle hypotézy Mrtvý Internet mj. tvoří většinu online interakcí boti.
     (63%)
     (7%)
     (14%)
     (16%)
    Celkem 139 hlasů
     Komentářů: 10, poslední dnes 17:35
    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: 477×
    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: 14
    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.