busy waiting
Megjelenés
Főnév
busy waiting (tsz. busy waitings)
- (informatika) A számítógép-programozásban a busy waiting, spinning vagy tevékeny várakozás azt jelenti, hogy egy folyamat újra és újra ellenőrzi, hogy egy feltétel igazzá vált-e, például hogy elérhető-e a bemenet a billentyűzetről, vagy hogy felszabadult-e egy erőforrás. Azokon a rendszereken, ahol még nem volt lehetőség a tetszőleges ideig tartó várakozásra, ezzel a módszerrel valósították meg a várakozást. Azonban a számítógépek sebessége különböző, és egy gép sebessége is változhat, különösen akkor, ha úgy van tervezve, hogy sebességét külső tényezőkhöz, például a terheléstől, így ez a módszer ma már nem szolgáltat megbízható eredményt. A kódnak meg kell határoznia, mennyi idő alatt hajtható végre egy várakozó ciklus, vagy pedig külső órát kell ellenőriznie.
Néha a busy waiting megfelelő stratégia, például SMP rendszerekre írt operációs rendszerekben bizonyos lockokra való várakozáskor (spinlock). Általában azonban antimintának tekinthető és kerülendő, mivel pazarolja a processzoridőt, amit hasznosabb feladatokra is lehetne használni.
C példa
Az alábbi C nyelvű kód két szálat tartalmaz, amelyek egy globális i változón osztoznak. Az első szál busy waitinget használ annak ellenőrzésére, hogy az i változó értéke megváltozott-e:
#include <stdio.h>
#include <pthread.h>
#include <unistd.h>
#include <stdlib.h>
volatile int i = 0; /* i is global, so it is visible to all functions.
It's also marked volatile, because it
may change in a way which is not predictable by the compiler,
here from a different thread. Thus preventing the compiler from
caching its value.*/
/* f1 uses a spinlock to wait for i to change from 0. */
static void *f1(void *p)
{
while (i==0) {
/* do nothing - just keep checking over and over */
}
printf("i's value has changed to %d.\n", i);
return NULL;
}
static void *f2(void *p)
{
sleep(60); /* sleep for 60 seconds */
i = 99;
printf("t2 has changed the value of i to %d.\n", i);
return NULL;
}
int main()
{
int rc;
pthread_t t1, t2;
rc = pthread_create(&t1, NULL, f1, NULL);
if (rc != 0) {
fprintf(stderr,"pthread f1 failed\n");
return EXIT_FAILURE;
}
rc = pthread_create(&t2, NULL, f2, NULL);
if (rc != 0) {
fprintf(stderr,"pthread f2 failed\n");
return EXIT_FAILURE;
}
pthread_join(t1, NULL);
pthread_join(t2, NULL);
puts("All pthreads finished.");
return 0;
}
A hasonló esetek megfelelő kezelésére a C11 óta elérhetők a monitorok feltételváltozói.
- busy waiting - Szótár.net (en-hu)
- busy waiting - Sztaki (en-hu)
- busy waiting - Merriam–Webster
- busy waiting - Cambridge
- busy waiting - WordNet
- busy waiting - Яндекс (en-ru)
- busy waiting - Google (en-hu)
- busy waiting - Wikidata
- busy waiting - Wikipédia (angol)