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 11:40 | Pozvánky
Program letošního ročníku konference Prague PostgreSQL Developer Days, která se koná již 15.-16.2. 2017 na ČVUT FIT, Thákurova 9, Praha 6, byl dnes zveřejněn. Najdete ho na stránkách konference včetně anotací přednášek a školení. Registrace na konferenci bude otevřena zítra (24.1.) v brzkých odpoledních hodinách.
TomasVondra | Komentářů: 0
včera 02:20 | Zajímavý článek

David Revoy, autor open source webového komiksu Pepper&Carrot nebo portrétu GNU/Linuxu, upozorňuje na svém blogu, že nový Inkscape 0.92 rozbíjí dokumenty vytvořené v předchozích verzích Inkscape. Problém by měl být vyřešen v Inkscape 0.92.2 [reddit].

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

Øyvind Kolås, hlavní vývojář grafických knihoven GEGL a babl, které využívá grafický program GIMP, žádá o podporu na Patreonu. Díky ní bude moci pracovat na vývoji na plný úvazek. Milník 1000 $, který by stačil na holé přežití, se již téměř podařilo vybrat, dalším cílem je dosažení 2500 $, které mu umožní běžně fungovat ve společnosti.

xkomczax | Komentářů: 12
21.1. 23:54 | Pozvánky

DevConf.cz 2017, již devátý ročník jedné z největších akcí zaměřených na Linux a open source ve střední Evropě, proběhne od pátku 27. ledna do neděle 29. ledna v prostorách Fakulty informačních technologií Vysokého učení technického v Brně. Na programu je celá řada zajímavých přednášek a workshopů. Letos je povinná registrace.

Ladislav Hagara | Komentářů: 0
21.1. 22:11 | Nová verze

Byla vydána verze 1.0.0 emulátoru terminálu Terminology postaveného nad EFL (Enlightenment Foundation Libraries). Přehled novinek v poznámkách k vydání.

Ladislav Hagara | Komentářů: 0
20.1. 17:00 | Nová verze

Byl vydán Docker 1.13. Přehled novinek na YouTube a v poznámkách k vydání na GitHubu. Docker umožňuje běh aplikací v softwarových kontejnerech (Wikipedia).

Ladislav Hagara | Komentářů: 6
20.1. 15:51 | Komunita

Mozilla.cz informuje, že nástroje pro webové vývojáře se možná oddělí od Firefoxu a stanou doplňkem. Nástroje pro webové vývojáře prošly velkým přepisem a tým, který se stará o jejich vývoj, by uvítal možnost jejich častějších aktualizacích nezávisle na vydávání nových verzí Firefoxu.

Ladislav Hagara | Komentářů: 10
20.1. 07:00 | Humor

Čtenářům AbcLinuxu vše nejlepší k dnešnímu Dni zvýšení povědomí o tučňácích (Penguin Awareness Day).

Ladislav Hagara | Komentářů: 0
20.1. 06:00 | Komunita

Bylo spuštěno hlasování o přednáškách a workshopech pro letošní InstallFest, jenž proběhne o víkendu 4. a 5. března v Praze. Současně byla oznámena změna místa. InstallFest se letos vrací zpět na Karlovo náměstí do budovy E.

Ladislav Hagara | Komentářů: 0
20.1. 02:48 | Komunita

Greg Kroah-Hartman potvrdil, že Linux 4.9 je jádrem s prodlouženou upstream podporou (LTS, Long Term Support). Podpora je plánována do ledna 2019. Aktuální jádra s prodlouženou podporou jsou tedy 3.2, 3.4, 3.10, 3.12, 3.16, 3.18, 4.1, 4.4 a 4.9.

Ladislav Hagara | Komentářů: 0
Jak se stavíte k trendu ztenčování přenosných zařízení (smartphony, notebooky)?
 (10%)
 (2%)
 (74%)
 (4%)
 (10%)
Celkem 367 hlasů
 Komentářů: 25, poslední 21.1. 13:34
Rozcestník
Reklama

Dotaz: pthread_mutex_init ve strukture

31.7.2014 11:37 pou | skóre: 15
pthread_mutex_init ve strukture
Přečteno: 426×
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: 15
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).

Řešení 1× (pou (tazatel))
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: 15
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: 60 | 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: 71 | 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: 15
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: 15
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: 71 | 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: 60 | 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: 71 | 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: 60 | 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: 71 | 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: 15
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: 11
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: 53 | 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.
Gentoo – Jsem open source vývojář, nikoli markeťák ⇒ názory zde uvedené jsou jen mé vlastní.
3.8.2014 22:39 Michal Kubeček | skóre: 71 | 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: 53 | blog: pavlix
Rozbalit Rozbalit vše Re: pthread_mutex_init ve strukture
+1
Gentoo – Jsem open source vývojář, nikoli markeťák ⇒ názory zde uvedené jsou jen mé vlastní.

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.