Byly zpracovány a na YouTube zveřejněny videozáznamy z konference LinuxDays 2025.
Na konferenci LinuxDays 2025 byl oficiálně představen nový router Turris Omnia NG.
Přímý přenos (YouTube) z konference LinuxDays 2025, jež probíhá tento víkend v Praze v prostorách FIT ČVUT. Na programu je spousta zajímavých přednášek.
V únoru loňského roku Úřad pro ochranu osobních údajů pravomocně uložil společnosti Avast Software pokutu 351 mil. Kč za porušení GDPR. Městský soud v Praze tuto pokutu na úterním jednání zrušil. Potvrdil ale, že společnost Avast porušila zákon, když skrze svůj zdarma dostupný antivirový program sledovala, které weby jeho uživatelé navštěvují, a tyto informace předávala dceřiné společnosti Jumpshot. Úřad pro ochranu osobních údajů
… více »Google Chrome 141 byl prohlášen za stabilní. Nejnovější stabilní verze 141.0.7390.54 přináší řadu novinek z hlediska uživatelů i vývojářů. Podrobný přehled v poznámkách k vydání. Opraveno bylo 21 bezpečnostních chyb. Za nejvážnější z nich (Heap buffer overflow in WebGPU) bylo vyplaceno 25 000 dolarů. Vylepšeny byly také nástroje pro vývojáře.
eDoklady mají kvůli vysoké zátěži technické potíže. Ministerstvo vnitra doporučuje vzít si sebou klasický občanský průkaz nebo pas.
Novým prezidentem Free Software Foundation (FSF) se stal Ian Kelling.
Na čem pracují vývojáři webového prohlížeče Ladybird (GitHub)? Byl publikován přehled vývoje za září (YouTube).
Vyšla kniha Počítačové programy a autorské právo. Podle internetových stránek nakladatelství je v knize "Významný prostor věnován otevřenému a svobodnému softwaru, jeho licencím, důsledkům jejich porušení a rizikům „nakažení“ proprietárního kódu režimem open source."
Red Hat řeší bezpečnostní incident, při kterém došlo k neoprávněnému přístupu do GitLab instance používané svým konzultačním týmem.
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: