Byla vydána verze 1.96.0 programovacího jazyka Rust (Wikipedie). Podrobnosti v poznámkách k vydání. Vyzkoušet Rust lze například na stránce Rust by Example.
Společnosti IBM a Red Hat představily Project Lightwell s investicí 5 miliard dolarů. Jedná se o důvěryhodné clearingové centrum pro bezpečnost open source softwaru a zabezpečení dodavatelských řetězců s novým AI modelem a globální skupinou více než 20 000 softwarových inženýrů. Služby centra budou dostupné prostřednictvím komerčních předplatných. Project Lightwell staví na iniciativách jako Anthropic Glasswing nebo OpenAI Trust Access for Cyber.
Open source 3D herní a simulační engine Open 3D Engine (O3DE) byl vydán v nové verzi 26.05. Podrobný přehled novinek v poznámkách k vydání.
Český stát by v budoucnu mohl provozovat vlastní alternativu ke komunikačním aplikacím typu WhatsApp, Signal, Telegram, Facebook Messenger a podobně. Cílem je zajistit bezpečnou datovou komunikaci pro stát a jeho důležité subjekty, jako jsou bezpečnostní složky, ministerstva a další organizace.
Už za týden, ve čtvrtek 4. června, se v Národní technické knihovně v pražských Dejvicích uskuteční další konference věnovaná tématům spojeným s IPv6 - Den IPv6. Program akce a registrační formulář jsou k dispozici na webu akce. Kapacita konference je omezená, proto organizátoři doporučují, aby se vážní zájemci přihlásili včas (k dnešnímu dni zbývá přibližně 30 volných míst). Konferenci Den IPv6 2026 organizují i letos společně sdružení CESNET, CZ.NIC a NIX.CZ.
Zařízení Steam Deck OLED bylo znovu naskladněno, ale vlivem rostoucích cen pamětí a úložišť má novou, vyšší cenovku. Steam Deck OLED 512 GB stojí nově 779 EUR (stál 569 EUR) a Steam Deck OLED 1 TB stojí 919 EUR (stál 679 EUR). Samotné zařízení se nijak nezměnilo a nové ceny tedy pouze odráží aktuální náklady na komponenty a další globální logistické výzvy, se kterými se potýká celá branže.
Český telekomunikační úřad zahajuje novou etapu využívání vysokofrekvenčního rádiového spektra v pásmu 26 GHz. Toto pásmo bude od 1. 7. 2026 otevřeno pro provoz moderních bezdrátových sítí, zejména sítí páté generace (5G), pevných bezdrátových přístupových sítí (FWA) a lokálních či průmyslových sítí určených například pro výrobní areály, logistická centra nebo technologické kampusy. Současně s otevřením pásma 26 GHz přistoupil ČTÚ ke zpřístupnění informací o využívání rádiových kmitočtů v tomto pásmu.
Logitech představil myš Signature Comfort Plus M850 L s polstrovanou opěrkou dlaně pro větší pohodlí a sadu s touto myší a klávesnicí s integrovanou opěrkou dlaní Signature Comfort Plus Combo MK880.
Gaël Duval se rozepsal o novinkách a plánech Murena a /e/OS. Počet uživatelů telefonů Murena a mobilního operačního systému /e/OS bez aplikací a služeb od Googlu se blíží 100 000. Ambicí je, aby se /e/OS stal třetí mobilní platformou v Evropě i na světě, s potenciálem dostat se i na PC. Blíží se vydání nové verze 4 s funkcemi zálohování a obnova, import e-mailů z Gmailu a rozpoznávání hlasu. Murena Workspace přinese videohovory, elektronický podpis a správu zařízení (MDM).
Dnes a zítra probíhá Ubuntu Summit 26.04. Na programu je řada zajímavých přednášek. Sledovat je lze na YouTube. Úvodní slovo měli Mark Shuttleworth a Jon Seager.
Běžící blákno, které může takto rychle získat zámek ...
struct mutex {
atomic_t count;
spinlock_t wait_lock;
struct list_head wait_list;
};
Jádro pudla je v tomto nižším patře = v kernelovém mutexu.
Všimněte si položky "struct list_head wait_list" - to je nějaký spojový seznam "čekatelů na zámek".
Uvnitř páru volání mutex_lock()/mutex_unlock() existují dvě cesty: rychlá a pomalá.
Pomalá cesta bere spinlock a hraje si s wait_listem (seznam čekajících procesů) = při mutex_lock() se vlákno do seznamu zapíše, při mutex_unlock() se vyškrtne.
Naproti tomu rychlá cesta uvnitř mutex_lock() za příznivých okolností jenom "proletí", nepřidává se do wait_listu = nebere spinlock, pouze si atomicky (s podporou CPU) dvakrát sáhne na položku count. Podobně uvnitř mutex_unlock().
Za příznivých okolností, konkrétně když o mutex soupeří dvě vlákna, a to ještě na konci delší "dávky" soupeřících vláken:
i v případě, že posixová synchronizační primitiva fungují, jak bych čekal. To je tak, když znovu vynalézám kolo, protože si ho chci maličko přitesat pro svoje potřeby...
Jádro pudla je v tomto nižším patře = v kernelovém mutexu.Strucne receno, mutex_lock() v jednom threadu uspeje drive nez skonci mutex_unlock() v druhem a ten druhy stale pristupuje k interni mutexove strukture. Pokud se na takove chovani podivam z hlediska konvencni semantiky posixovych mutexu (tedy pokud by se tak chovali userspace mutexy), tak mi to jako zavadne neprijde (primarni cil - vzajemne vylouceni kodu *uvnitr* mutexove sekce - je zajisten), akorat mutex_destroy() by musel vzit spinlock a tim se ujistit, ze paralelni mutex_unlock() uz skoncil. To by mohlo byt i adekvatni reseni pro kernelove mutexy.
R.
delete kdekoliv mimo destruktor smart pointerů pokládám za velmi špatný kód* a race conditions dealokací opět dobře řeší smart pointery používající atomický reference counter. Zde je to zesložitěné tím, že se tam snaží aktivně spouštět jiné vlákno, ale s něčím takovým se v user space setkáte jen výjimečně.
* Schválně za jak dlouho přijdete na to, že tohle leakuje?
class Socket
{
public:
Socket()
{
if (!connect())
throw std::exception();
}
bool connect()
{
return false;
}
};
class Test
{
public:
constexpr size_t BUF_SIZE = 4096;
char *buf;
Socket sock;
Test()
: buf(new char[BUF_SIZE]())
{}
~Test()
{
delete[] buf;
}
}
Chápu, že to omezení na destruktor strong pointerů je součást nějakého programátorského postupu, jak dosáhnout "vzájemně zaručeného zničení". Nicméně mi to i tak přijde trochu nekompletní, pokud do věci vstupují výjimky...
sock), tak se nezavolá tělo destruktoru; nakonec to je logické, objekt se ještě nevytvořil, a tak není co ničit. C++ v takovém případě volá destruktory všech již zkonstruovaných členů a předků (pokud by Test měl předka, tak jeho destruktor se zavolá), zde tedy program zavolá destruktor buf, jenže to je char *, který se sám nedealokuje. Pokud by buf byl smart pointer, tak jeho destruktor tu paměť uklidí.
S výjimkami není problém, pokud dodržujete RAII, tedy že každý zabraný zdroj má vlastní „hlídací“ objekt, který jej v destruktoru uvolní. A tohle pravidlo právě vede k tomu, aby delete používaly akorát smart pointery (a výrazně zjednodušuje hlídání zdrojů oproti C
).
Ještě bych dodal, že existuje druhé pravidlo, a to že destruktor nemá vyhazovat výjimky, pokud je volán při zpracovávání výjimky (na rozdíl od toho, co méně zkušení programátoři často tvrdí, tak jinak může a dokonce by i měl, pokud třeba selže flush bufferu, tak se asi nepodařilo zapsat data, což by se program měl dozvědět, ale pokud je objekt ničen při zpracování výjimky, pak se stalo něco, co rozhodilo vyšší vrstvu a vzniklé problémy jsou velmi pravděpodobně zavlečené). To jde ale naštěstí vyřešit celkem snadno takto:
~Test()
try {
⋮ // Volání funkcí, které mohou vyhodit výjimku, kromě destruktorů — tam by si to měl řešit ničené objekty
} catch (...) {
if (std::uncaught_exception())
// Případně nějaké logování, pokud vás to zajímá
return;
// catch blok, kterým končí konstruktor či destruktor, má implicitní rethrow
}
noexcept, je potřeba to zrušit:
~Test noexcept(false)
To je syntaxe ve stylu: „Půjdu na nákup ne.“ To snad museli vymyslet Francouzi.Spíš lidi z Cisca
(no shutdown)
Ale ono zrovna v tomhle případě to je namístě, u drtivé většina destruktoru je noexcept vhodný.
delete jsem od té doby, co delete u kódu, který spravuji, smí používat jen smart pointery, neviděl.
Jádro není v C++ hlavně proto, že v roce 1991 byla podpora C++ dost mizerná. A taky proto, že v jádře bývá problém s implementací výjimek a RTTI, tak se to tam nepoužívá, čímž se C++ snižuje na C with classes. A to už pak rovnou jde psát v C.
takže je mutex odemčený, a přitom o sobě ví, že je používán
Odhaduji, že je to dobré spíš pro kontrolu chyb (pthread_mutex_destroy() vrátí v tomto stavu chybu) než k nějaké optimalizaci rychlosti.
Nakonec asi nejvíc optimismu mi vlévá do žil jedna poznámka v linuxové manuálové stránce pthread_mutex_init():
http://linux.die.net/man/3/pthread_mutex_init
Hledejte kapitolu Destroying Mutexes. Je tam kus zdrojáku, který přesně odpovídá našemu problému "poslední zhasne". A tvrdí se tam, že posixové mutexy jsou vůči tomuto stylu zrušení a dealokace odolné. Ještě mě napadlo, mkrnout se do zdrojáku pthread_mutex_destroy(), jestli je tam nějaký extra low-level zámek nebo kontrola - není, prostě se jenom zkontroluje user_count mutexu, bez zamykání. Takže je asi jinde zajištěno, že hodnotě user_count se dá věřit ve vztahu k bezpečné dealokaci. Popravdě řečeno pthread_mutex_destroy() tuto kontrolu provede pouze jednou, a pokud není splněna, vrátí chybu - ale vzorový zdroják v manuálové stránce ani nehlídá návratovou hodnotu pthread_mutex_destroy(), takže teoreticky předpokládá jistotu, že po návratu pthread_mutex_unlock() už žádný opozdilec s mutexem nefidlá (pokud jsme k tomuto závěru došli na základě našeho externího uživatelského reference countu).
Tiskni
Sdílej: