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í
×
eParkomat, startup z ČR, postoupil mezi finalisty evropského akcelerátoru ChallengeUp!
Robot na pivo mu otevřel dveře k opravdovému byznysu
Internet věcí: Propojený svět? Už se to blíží...
dnes 12:00 | Zajímavý projekt

Projekt Termbox umožňuje vyzkoušet si linuxové distribuce Ubuntu, Debian, Fedora, CentOS a Arch Linux ve webovém prohlížeči. Řešení je postaveno na projektu HyperContainer. Podrobnosti v často kladených dotazech (FAQ). Zdrojové kódy jsou k dispozici na GitHubu [reddit].

Ladislav Hagara | Komentářů: 5
dnes 11:00 | Bezpečnostní upozornění

Byly zveřejněny informace o bezpečnostní chybě CVE-2016-8655 v Linuxu zneužitelné k lokální eskalaci práv. Chyba se dostala do linuxového jádra v srpnu 2011. V upstreamu byla opravena minulý týden [Hacker News].

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

Přibližně před měsícem bylo oznámeno, že linuxová distribuce SUSE Linux Enterprise Server (SLES) běží nově také Raspberry Pi 3 (dokumentace). Obraz verze 12 SP2 pro Raspberry Pi 3 je ke stažení zdarma. Pro registrované jsou po dobu jednoho roku zdarma také aktualizace. Dnes bylo oznámeno, že pro Raspberry Pi 3 je k dispozici také nové openSUSE Leap 42.2 (zprávička). K dispozici je hned několik obrazů.

Ladislav Hagara | Komentářů: 5
včera 06:00 | Zajímavý software

OMG! Ubuntu! představuje emulátor terminálu Hyper (GitHub) postavený na webových technologiích (HTML, CSS a JavaScript). V diskusi k článku je zmíněn podobný emulátor terminálu Black Screen. Hyper i Black Screen používají framework Electron, stejně jako editor Atom nebo vývojové prostředí Visual Studio Code.

Ladislav Hagara | Komentářů: 33
včera 06:00 | Zajímavý článek

I letos vychází řada ajťáckých adventních kalendářů. QEMU Advent Calendar 2016 přináší každý den nový obraz disku pro QEMU. Programátoři se mohou potrápit při řešení úloh z kalendáře Advent of Code 2016. Kalendáře Perl Advent Calendar 2016 a Perl 6 Advent Calendar přinášejí každý den zajímavé informace o programovacím jazyce Perl. Stranou nezůstává ani programovací jazyk Go.

Ladislav Hagara | Komentářů: 9
3.12. 16:24 | Nová verze

Byla vydána Mageia 5.1. Jedná se o první opravné vydání verze 5, jež vyšla v červnu loňského roku (zprávička). Uživatelům verze 5 nepřináší opravné vydání nic nového, samozřejmě pokud pravidelně aktualizují. Vydání obsahuje všechny aktualizace za posledního téměř půldruhého roku. Mageia 5.1 obsahuje LibreOffice 4.4.7, Linux 4.4.32, KDE4 4.14.5 nebo GNOME 3.14.3.

Ladislav Hagara | Komentářů: 17
3.12. 13:42 | Pozvánky

V Praze probíhá konference Internet a Technologie 16.2, volné pokračování jarní konference sdružení CZ.NIC. Konferenci lze sledovat online na YouTube. K dispozici je také archiv předchozích konferencí.

Ladislav Hagara | Komentářů: 0
2.12. 22:44 | Komunita

Joinup informuje, že Mnichov používá open source groupware Kolab. V srpnu byl dokončen dvouletý přechod na toto řešení. V provozu je asi 60 000 poštovních schránek. Nejenom Kolabu se věnoval Georg Greve ve své přednášce Open Source: the future for the European institutions (SlideShare) na konferenci DIGITEC 2016, jež proběhla v úterý 29. listopadu v Bruselu. Videozáznam přednášek z hlavního sálu je ke zhlédnutí na Livestreamu.

Ladislav Hagara | Komentářů: 25
2.12. 15:30 | Zajímavý projekt

Společnost Jolla oznámila v příspěvku Case study: Sailfish Watch na svém blogu, že naportovala Sailfish OS na chytré hodinky. Využila a inspirovala se otevřeným operačním systémem pro chytré hodinky AsteroidOS. Použita je knihovna libhybris. Ukázka ovládání hodinek na YouTube.

Ladislav Hagara | Komentářů: 18
2.12. 14:15 | Nová verze

Byla vydána verze 7.1.0 skriptovacího jazyka PHP používaného zejména k vývoji dynamických webových stránek. Jedná se o první stabilní verzi nejnovější větvě 7.1. Přehled novinek v dokumentaci. Podrobnosti v ChangeLogu. K dispozici je také příručka pro přechod z PHP 7.0.x na PHP 7.1.x.

Ladislav Hagara | Komentářů: 6
Kolik máte dat ve svém domovském adresáři na svém primárním osobním počítači?
 (32%)
 (24%)
 (29%)
 (7%)
 (5%)
 (3%)
Celkem 775 hlasů
 Komentářů: 50, poslední 29.11. 15:50
Rozcestník
Reklama

Dotaz: pthread_cancel

Jardík avatar 8.5.2010 22:40 Jardík | skóre: 40 | blog: jarda_bloguje
pthread_cancel
Přečteno: 279×
Snažím se nastavit handler pro úklid dat ve vláknu, ale nějak se nedaří, GCC mi píše nějaký blbosti.
template<typename T>
class CancelableThreadData
{
	protected:
		bool _is_cleanup;
		T* _data;
		static void _cleanup_func(void* d);
	public:
		template<typename... T_args>
		CancelableThreadData(T_args... args);
		
		~CancelableThreadData();
		
		T* operator->() { return _data; }
		const T* operator->() const { return _data; }
		
		T& operator*() { return *_data; }
		const T& operator*() const { return *_data; }
};

template<typename T>
void CancelableThreadData<T>::_cleanup_func(void* d)
{
	((CancelableThreadData<T>*)(d))->_is_cleanup = true;
	((CancelableThreadData<T>*)(d))->~CancelableThreadData();
}

template<typename T>
template<typename... T_args>
CancelableThreadData<T>::CancelableThreadData(T_args... args)
{
	_is_cleanup = false;
	_data = new T(args...);
	pthread_cleanup_push(_cleanup_func, (void*)_data);
}

/* Line 272 */template<typename T>
CancelableThreadData<T>::~CancelableThreadData()
{
	if (!_is_cleanup) pthread_cleanup_pop(0);
	delete _data;
}

Výstup gcc:
Thread.h: In constructor ‘BurnLib::CancelableThreadData<T>::CancelableThreadData(T_args ...)’:
Thread.h:272:10: error: expected ‘while’ before ‘<’ token
Thread.h:272:10: error: expected ‘(’ before ‘<’ token
Thread.h:272:10: error: expected primary-expression before ‘<’ token
Thread.h:272:20: error: expected nested-name-specifier before ‘T’
Thread.h:272:20: error: expected ‘(’ before ‘T’
Thread.h:272:20: error: expected ‘)’ before ‘T’
Thread.h:272:20: error: expected ‘;’ before ‘T’
Thread.h:272:21: error: expected unqualified-id before ‘>’ token
Věřím v jednoho Boha.

Řešení dotazu:


Odpovědi

Jardík avatar 8.5.2010 23:18 Jardík | skóre: 40 | blog: jarda_bloguje
Rozbalit Rozbalit vše Re: pthread_cancel
To voe, voni to jsou makra a ještě tak prasácký! Od kdy? Manuál mi tvrdí, že to jsou funkce a když kouknu do pthread.h, tak tam jsou samý makro-prasárny, až jsem se lekl.
Věřím v jednoho Boha.
8.5.2010 23:29 Sinuhet | skóre: 31
Rozbalit Rozbalit vše Re: pthread_cancel

Tak ten manual zahodte a poridte si lepsi:

These functions may be implemented as macros. The application shall ensure that they appear as statements, and in pairs within the same lexical scope (that is, the pthread_cleanup_push() macro may be thought to expand to a token list whose first token is '{' with pthread_cleanup_pop() expanding to a token list whose last token is the corresponding '}' ).
Jardík avatar 9.5.2010 00:04 Jardík | skóre: 40 | blog: jarda_bloguje
Rozbalit Rozbalit vše Re: pthread_cancel
Akorát nevím, proč jsem se s tím dělal, když jsem teď zjistil, že se mi zavolá destruktor objektu i při přímém zavolání pthread_exit, či při použití pthread_cancel. Jak to? Vždyť se přece nedostanu mimo scope (teda dostanu, ale kompilátor to přece nemůže věďet?).
Věřím v jednoho Boha.
Jardík avatar 9.5.2010 00:18 Jardík | skóre: 40 | blog: jarda_bloguje
Rozbalit Rozbalit vše Re: pthread_cancel
Na stránkách HP zase tvrdí, že C++ objekty uklízeny nejsou. Tak babo raď, u mě uklízeny jsou...?
Věřím v jednoho Boha.
Bluebear avatar 9.5.2010 00:34 Bluebear | skóre: 30 | blog: Bluebearův samožerblog | Praha
Rozbalit Rozbalit vše Re: pthread_cancel
Celou funkčnost POSIXových threadových funkcí zajišťuje libc (jsou to všechno wrappery nad clone(), pár dalšími voláními a signály); teoreticky to může být nějak ošetřené, aby se destruktory zavolaly, ale nespoléhal bych na to. Při představě použití se složitými objekty z C++, kde destruktor může provádět relativně komplikované akce, se mi ježí všechny chlupy; to se může volat ze signal handleru nebo s kdovíjakým kontextem, stačí jedno blbé volání a budeš to ladit až do důchodu.

Pokud to nutně potřebuješ, nezbývá než se podívat do zdrojáků libc - ale upozorňuji, že tato část libc bude na čtení opravdu *strašná*, protože jsou to wrappery snažící se splňovat POSIXový standard, který je naprosto padlý na hlavu, za pomoci POSIXových signálů, které jsou padlé na hlavu taky, a Linuxových callů, které sice možná nejsou úplně šílené, ale nejsou navrženy pro použití normálním člověkem, nýbrž pouze autory libc. Blicí pytlík povolen a doporučen.
To mi připomíná, jak jsem si pořídil květináč, že v něm budu mít květinu. Opravdu tam byla, ale potom být přestala...
Jardík avatar 9.5.2010 00:57 Jardík | skóre: 40 | blog: jarda_bloguje
Rozbalit Rozbalit vše Re: pthread_cancel
Problém zase je, že když na to nebudu spoléhat a použiju ten "obal", co jsem použil výše, tak se mi pak zase destruktor zavolá 2x, tak si hezky vybrat :-). Nakonec pak skončim u assembleru, kde budu alespoň vědět, co se stane :-)
Věřím v jednoho Boha.
Bluebear avatar 9.5.2010 01:14 Bluebear | skóre: 30 | blog: Bluebearův samožerblog | Praha
Rozbalit Rozbalit vše Re: pthread_cancel
Dynamicky alokované objekty to nesebere, to nesmí; takže v nejhorším tudy vede jakás takás cesta.

Vzhledem k tomu, že pthread_cleanup_push() vlastně začíná vlastní scope (protože obsahuje otevírací složenou závorku) a pthread_cleanup_pop() ho zase uzavírá, tak je představitelné (ale ne jisté), že pro objekty deklarované uvnitř toho scopu budou skutečně zavolány destruktory. Můžeš to zkusit; pokud to bude fungovat na Linuxu, snad by to mohlo být i přenositelné.

Zvážil bych ještě možnost vyloučit pthread_cancel() ze hry úplně a udělat komunikaci mezi těmi thready jinak (třeba pomocí signálů, ty se aspoň dají pochopit, nebo pomocí socketů či něčeho takového).
To mi připomíná, jak jsem si pořídil květináč, že v něm budu mít květinu. Opravdu tam byla, ale potom být přestala...
Jardík avatar 9.5.2010 13:13 Jardík | skóre: 40 | blog: jarda_bloguje
Rozbalit Rozbalit vše Re: pthread_cancel
Ale ono i když pthread_cleanup_push() nepoužiju a ten objekt je ve scopu té funkce, kde se začíná vykonávat thread, tak po pthread_cancel i pthread_exit se mi ty destruktory zavolají, jakoby tam byl nějaký "zvláštní" mechanismus pro úklid. Něco jsem našel tu:
Unlike some other implementations of threads, C++ destructors for automatic objects are allowed to run in a well defined and consistent manner when a thread is terminated.

....

When a thread terminates, the following occurs: If the thread was ended using pthread_exit(), pthread_cancel() or return from the thread start routine, then cancellation cleanup handlers and data destructors are run.
The thread is terminated. At the time that the thread is terminated, both C++ destructors for automatic objects and AS/400 cancel handlers run.
Věřím v jednoho Boha.
Jardík avatar 9.5.2010 00:06 Jardík | skóre: 40 | blog: jarda_bloguje
Rozbalit Rozbalit vše Re: pthread_cancel
Jinak našel jsem to tam taky, ale proč mi na začátku tvrdí "these functions" a na konci (kde to nečtu :-)) mi řeknou, že to můžou být makra ...
Věřím v jednoho Boha.
Bluebear avatar 9.5.2010 00:37 Bluebear | skóre: 30 | blog: Bluebearův samožerblog | Praha
Rozbalit Rozbalit vše Re: pthread_cancel
Možná proto, aby čtenář nezešílel už při prvních řádcích. POSIXové thready je nutné člověku vysvětlovat pomalu a opatrně, jinak hrozí psychická újma.
To mi připomíná, jak jsem si pořídil květináč, že v něm budu mít květinu. Opravdu tam byla, ale potom být přestala...

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.