Byl vydán Nextcloud Hub 8. Představení novinek tohoto open source cloudového řešení také na YouTube. Vypíchnout lze Nextcloud AI Assistant 2.0.
Vyšlo Pharo 12.0, programovací jazyk a vývojové prostředí s řadou pokročilých vlastností. Krom tradiční nadílky oprav přináší nový systém správy ladících bodů, nový způsob definice tříd, prostor pro objekty, které nemusí procházet GC a mnoho dalšího.
Microsoft zveřejnil na GitHubu zdrojové kódy MS-DOSu 4.0 pod licencí MIT. Ve stejném repozitáři se nacházejí i před lety zveřejněné zdrojové k kódy MS-DOSu 1.25 a 2.0.
Canonical vydal (email, blog, YouTube) Ubuntu 24.04 LTS Noble Numbat. Přehled novinek v poznámkách k vydání a také příspěvcích na blogu: novinky v desktopu a novinky v bezpečnosti. Vydány byly také oficiální deriváty Edubuntu, Kubuntu, Lubuntu, Ubuntu Budgie, Ubuntu Cinnamon, Ubuntu Kylin, Ubuntu MATE, Ubuntu Studio, Ubuntu Unity a Xubuntu. Jedná se o 10. LTS verzi.
Na YouTube je k dispozici videozáznam z včerejšího Czech Open Source Policy Forum 2024.
Fossil (Wikipedie) byl vydán ve verzi 2.24. Jedná se o distribuovaný systém správy verzí propojený se správou chyb, wiki stránek a blogů s integrovaným webovým rozhraním. Vše běží z jednoho jediného spustitelného souboru a uloženo je v SQLite databázi.
Byla vydána nová stabilní verze 6.7 webového prohlížeče Vivaldi (Wikipedie). Postavena je na Chromiu 124. Přehled novinek i s náhledy v příspěvku na blogu. Vypíchnout lze Spořič paměti (Memory Saver) automaticky hibernující karty, které nebyly nějakou dobu používány nebo vylepšené Odběry (Feed Reader).
OpenJS Foundation, oficiální projekt konsorcia Linux Foundation, oznámila vydání verze 22 otevřeného multiplatformního prostředí pro vývoj a běh síťových aplikací napsaných v JavaScriptu Node.js (Wikipedie). V říjnu se verze 22 stane novou aktivní LTS verzí. Podpora je plánována do dubna 2027.
Byla vydána verze 8.2 open source virtualizační platformy Proxmox VE (Proxmox Virtual Environment, Wikipedie) založené na Debianu. Přehled novinek v poznámkách k vydání a v informačním videu. Zdůrazněn je průvodce migrací hostů z VMware ESXi do Proxmoxu.
R (Wikipedie), programovací jazyk a prostředí určené pro statistickou analýzu dat a jejich grafické zobrazení, bylo vydáno ve verzi 4.4.0. Její kódové jméno je Puppy Cup.
Ahojte, učim sa trochu multithreading v C, a narazil som na správanie ktorému nerozumiem. Mám tento programček:
#include <stdio.h>
#include <pthread.h>
#include <semaphore.h>
#include <unistd.h>
#define ITER 10000
sem_t sem;
void *threadFunc(void *arg)
{
//This function does nothing
usleep(1);
sem_post(&sem);
return NULL;
}
int main(void) {
pthread_t pth[ITER]; // array of thread identifiers
int j=0 ;
signed int valp; //value of semaphore
sem_init(&sem, 0, 3);
for (j=0;j <ITER;j++) {
sem_getvalue(&sem,&valp);
printf ("Semaphore value: %.d\n",valp);
sem_wait(&sem);
printf ("Starting thread %.d\n", j);
pthread_create(&pth[j],NULL,threadFunc, NULL);
}
return 0;
}
(To isté je v priloženom súbore)
problem je že to neurobí všetkých 10 000 threadov, ale zastaví to pri tomto:
Starting thread 378
Semaphore value: 1
Starting thread 379
Semaphore value: 1
Starting thread 380
Semaphore value: 1
Starting thread 381
Semaphore value: 1
Starting thread 382
Semaphore value: 1
Starting thread 383
Semaphore value:
a stoji to, kým to nezabijem. Vedel by mi niekto vysvetliť, prečo sa to stáva a ako sa tomu vyhnúť?
Vďaka
pthread_create returned: Semaphore value: 2 Starting thread 380 pthread_create returned: Semaphore value: 2 Starting thread 381 pthread_create returned: 12 Semaphore value: 2 Starting thread 382 pthread_create returned: 12 Semaphore value: 1 Starting thread 383 pthread_create returned: 12 Semaphore value:Riešenie z netu: "the solution is to use the PTHREAD_CREATE_DETACHED flag." When a thread is created detached (PTHREAD_CREATE_DETACHED), its thread ID and other resources can be reused as soon as the thread terminates. Takže skusim pozmeniť kod v tomto zmysle. Inak, je to normálny prístup, ked potrebujem vytvoriť rádovo miliony threadov v pár sekundách, alebo ten program mám premyslieť inak?
pthread_detach(pth[j]);
bude vše fungovat. Řeší se to například zde
pthread_attr_t tattr; pthread_attr_setdetachstate(&tattr,PTHREAD_CREATE_DETACHED);
pthread_detach
a nastavením atributu vlákna by neměl být výkonnostní rozdíl, nicméně ten přístup s pthread_attr_t
je přehlednější, takže bych ho preferoval. Otázkou je, jestli je potřeba vytvářet tolik vláken, navíc když jich máte najednou spuštěno jen malé množství. Pokud to jde, tak jich vytvořte jen pár a postupně jim "zadávejte práci", snad jde pochopit co jsem tím chtěl říct. Vytvoření vlákna totiž poměrně časově náročné je, zvláště pak, pokud se bavíme o milionech vláken.
ulimit -s
nebo setrlimit()
) nebo rovnou pomocí pthread_attr_setstacksize()
. Těch defaultních 8 MB je nesmyslně moc, u multithreadových aplikací obvykle používám 64-128 KB. Jen je pak samozřejmě potřeba být trochu opatrnější na statické lokální proměnné.
Ale na druhej stráne sa mi nepáči že počet threadov je tam napevno zakodovaný.
Pevný strop tam sice je, ale je podstatně vyšší (obvykle jsou to přinejmenším desítky tisíc). Vy jste ve skutečnosti narazil spíš na to, že vám defaultní 8MB zásobníky pro každý thread vyčerpaly paměť (vynásobte si 8 MB počtem vláken). Tomu se ale dá snadno předejít - viz můj předchozí příspěvek.
teraz to mám tak, že sa spustia 3 thready (robia viac ako robili predtým) a program čaká kým všetky 3 skončia (pthrad_join). A ide další cyklus...
To není moc šťastné řešení, takhle tam budete mít zbytečné prostoje při čekání, až skončí všechny tři pracovní thready. Efektivnější je třeba
(A) na začátku vytvoříte určitý počet "worker" threadů, které si budou v cyklu brát z fronty požadavky a vykonávat je. Hlavní thread bude postupně ukládat požadavky do fronty (když bude plná, počká - např. pomocí condition variable). Až budou všechny požadavky zadané, počká, až budou všechny hotové a worker thready ukončí (pthread_cancel()
nebo nastavením příznaku a buď rozesláním signálu nebo pthread_cond_broadcast()
).
(B) pokud vás netrápí režie vytvoření threadu (obvykle ne), lze to řešit tak, že si vyrobíte semafor s počáteční/maximální hodnotou nastavenou na požadovaný počet worker threads a v cyklu vždy počkáte na semafor a vyrobíte worker thread (cyklus ukončíte, když už došly úlohy). Tím bude zajištěno, že v žádném okamžiku nepoběží víc worker threadů než chcete, a jakmile nějaký skončí, spustí se nový. Na konci samozřejmě musíte opět počkat, až budou všichni hotovi (ukončování v tomto případě řešit nepotřebujete).
pthread_detach()
na vlákno, které už mezitím stihlo skončit, takže raději používám pthread_detach(pthread_self())
ve vlákně samotném (nebo atribut).
Tiskni Sdílej: