Kako postaviti pametne telefone i računala. Informativni portal

Dodatak. Osnove ActionScript-a

Kako bi se logika mogla implementirati u program, koriste se uvjetni operatori. Konceptualno, ovi operatori se mogu predstaviti kao čvorne točke, dostižući koje program bira u kojem od mogućih smjerova će se kretati dalje. Na primjer, trebate odrediti sadrži li neka varijabla arg pozitivan ili negativan broj i prikazati odgovarajuću poruku na ekranu. Da biste to učinili, možete koristiti if naredbu (if), koja obavlja slične provjere.

U najjednostavnijem slučaju, sintaksa za dati if izraz je sljedeća:

ako (izraz)

Ako je vrijednost parametra "expression" "true", naredba se izvršava, inače je program preskače. Treba napomenuti da je "izraz" uvjetni izraz u kojem se provjerava neki uvjet. Stol 2.1 predstavlja varijante jednostavnih logičkih izraza if naredbe.

Tablica 2.1. Jednostavni Booleovi izrazi

Navedimo primjer korištenja if operatora grananja. Sljedeći program omogućuje određivanje predznaka unesene varijable.

Listing 2.1. Prvi program za određivanje predznaka unesenog broja.

#uključiti
int main ()
{
float x;
printf ("Unesite broj:");
scanf (“% f”, & x);
ako je (x> = 0)

Vrati 0;
}

Analiza zadanog programskog teksta pokazuje da se dva uvjetna operatora mogu zamijeniti jednim pomoću konstrukcije

ako (izraz)

što se tako tumači. Ako je "izraz" istinit, tada se izvršava "izjava1", u suprotnom se izvršava "izjava2". Prepišimo prethodno navedeni primjer određivanja predznaka broja pomoću ove konstrukcije.

Listing 2.2. Drugi program za određivanje predznaka unesenog broja.

#uključiti
int main ()
{
float x;
printf ("Unesite broj:");
scanf (“% f”, & x);
if (x printf (“Uneseni broj% f je negativan. \ n”, x);
drugo
printf (“Uneseni broj% f nije negativan. \ n”, x);

Vrati 0;
}

U prikazanim primjerima, nakon if i else naredbi, postoji samo jedna funkcija printf (). U slučajevima kada je potrebno napisati više od jednog operatora kada je uvjet ispunjen, moraju se koristiti vitičaste zagrade, tj. koristiti konstrukciju poput

ako (izraz)
{

}
drugo
{

Treba napomenuti da nakon ključne riječi else možete formalno staviti još jedan if uvjetni izraz, kao rezultat toga dobivamo još fleksibilniju konstrukciju uvjetnih prijelaza:

ako (izraz1)
inače ako (izraz2)
drugo

Listing 2.3 prikazuje program koji implementira posljednju uvjetnu granu konstrukciju.

Listing 2.3. Treći program za određivanje predznaka unesenog broja.

#uključiti
int main ()
{
float x;
printf ("Unesite broj:");
scanf (“% f”, & x);
if (x printf (“Uneseni broj% f je negativan. \ n”, x);
inače ako (x> 0)
printf (“Uneseni broj% f je pozitivan. \ n”, x);
drugo
printf (“Uneseni broj% f nije negativan. \ n”, x);

Vrati 0;
}

Do sada smo razmatrali jednostavne uvjete kao što je x && - logično I
|| - logično ILI
! - logično NE

Na temelju ove tri logičke operacije mogu se generirati složeniji uvjeti. Na primjer, ako postoje tri varijable exp1, exp2 i exp3, tada one mogu činiti logičke konstrukcije prikazane u tablici. 2.2.

Tablica 2.2. Primjer složenih logičkih izraza

Kao i operacije množenja i zbrajanja u matematici, logičke operacije I ILI NE, također imaju svoje prioritete. Operacija NE ima najveći prioritet, t.j. takva se operacija najprije izvodi. Operacija AND ima niži prioritet, a konačno operacija OR ima najniži prioritet. Ovi se prioriteti moraju uzeti u obzir pri izradi složenih uvjeta. Na primjer, stanje

if (4 6 || 5 je testiran na ovaj način. If 4 6 OR 5 if (4 6 || 5 if izraz olakšava pisanje programa u kojima trebate birati između malog broja mogućih opcija. Međutim, ponekad program treba odabrati jednu opciju od mnogih mogućih. Formalno, možete koristiti if else if ... else konstrukciju. Međutim, u mnogim slučajevima se ispostavi da je prikladnije koristiti naredbu C++ switch. sintaksa ovog operatora je sljedeća:

prekidač (varijabilan)
{
konstanta slučaja1:

Konstanta slučaja 2:

...
zadano:

Ovaj operator sekvencijalno provjerava jednakost varijable s konstantama iza ključne riječi case. Ako niti jedna od konstanti nije jednaka vrijednosti varijable, tada se izvršavaju naredbe iza riječi default. Naredba switch ima sljedeću posebnost. Pretpostavimo da je vrijednost varijable jednaka vrijednosti konstante1 i da se naredbe nakon ključne riječi prvog case izvršavaju. Nakon toga će se izvođenje programa nastaviti provjeravanjem varijable jednakosti konstante2, što često dovodi do nepotrebnog trošenja računalnih resursa. Da biste izbjegli ovu situaciju, trebali biste upotrijebiti naredbu break da premjestite program na sljedeći izraz nakon prebacivanja.

Listing 2.4 prikazuje primjer programiranja izraza uvjetnog prekidača.

Listing 2.4. Primjer korištenja naredbe switch.

#uključiti
int main ()
{
int x;
printf ("Unesite broj:");
scanf (“% d”, & x);
prekidač (x)
{
slučaj 1: printf (“Unesen broj 1 \ n”); prekid;
slučaj 2: printf (“Unesen broj 2 \ n”); pauza;
zadano: printf (“Unesen još jedan broj \ n”);
}
char ch;
printf ("Unesite znak:");
scanf ("% c", & ch);
prekidač (ch)
{
case 'a': printf ("Unesen je znak a \ n"); pauza;
case 'b': printf ("Unesen znak b \ n"); pauza;
zadano: printf (“Unesen je još jedan znak \ n”);
}
vrati 0;
}

Ovaj primjer pokazuje dva različita slučaja upotrebe naredbe switch. U prvom slučaju analizira se unesena znamenka, u drugom se analizira uneseni znak. Treba napomenuti da ovaj operator može napraviti izbor samo na temelju jednakosti svog argumenta s jednom od navedenih vrijednosti slučaja, t.j. provjera izraza kao što je x

Možete pohraniti znanje o sugovornicima ili bilo koju drugu tekstualnu informaciju. Sada, prilikom pisanja predložaka, možete koristiti 13 varijabli s unaprijed određenom namjenom i 100 "besplatnih" koje vlasnici informacija mogu koristiti prema vlastitom nahođenju.
Varijable s danim ciljem imaju smislena imena. Na primjer, % Korisničko ime Varijabla je dizajnirana za pohranjivanje imena sugovornika. Njezino ime koristi engleske riječi user ("user") i name ("name"). Takve varijable programeri aktivno koriste pri izradi baze standardnih predložaka informacija, na temelju kojih se kreiraju svi korisnički podaci u projektu.
Životni vijek takvih varijabli nije ograničen; njihove vrijednosti se pamte i pohranjuju između odvojenih razgovora.

Što piše u predlošcima Primjer dijaloga
Zapamti ime:
$ Moje ime je *
# Drago mi je. [% user_name = "[* 1]"]
Gost: Moje ime je Vasya
Inf: Nađite se jednom.
U odgovoru na infa prikazujemo ime sugovornika:
$ Zbogom, inf.
# Zbogom, [% user_name]
Gost: Zbogom, inf.
Inf: Zbogom Vasya.
Odabiremo odgovor ovisno o vrijednosti varijable % user_name:
$ Sjećate li se mog imena?
# (Naravno. Vi ste [% user_name].)
# (Ne. Nisi mi rekao svoje ime.)
Gost: Sjećaš li se mog imena?
Inf: Sigurno. Ti si Vasya.
ili
Gost: Sjećaš li se mog imena?
Inf: Ne. Nisi mi rekao svoje ime.
Ne želimo više spremati ime sugovornika, resetujemo varijablu
$ Ti si budala.
# To je to, nisam više prijatelj s tobom, a zaboravio sam tvoje ime. [% user_name = ""]
Gost: Ti si budala.
Inf: To je to, nisam više prijatelj s tobom, a zaboravio sam tvoje ime.

Dodjela vrijednosti varijabli i nuliranje varijable

Možete dodijeliti vrijednost varijabli ili je postaviti na nulu u odgovorima na infa.

Sintaksa:[% varijable = "vrijednost"]
Naredba za dodjelu varijable uvijek je okružena uglastim zagradama, koji su ovdje simboli usluge. Vrijednost varijable uvijek je zatvorena pod navodnicima.
Primjeri dodjele vrijednosti:
$ Bavim se rock and rollom.
# Zavidim. INF-ovi ne mogu plesati [% var1 = "ples"]

$ * mrzim * plesati *
$ * ples * mrzim *
$ * ne pleši *
# Šteta je. Da sam čovjek, sigurno bih plesao. [% var1 = "ne voli plesati"]

$ Imam ** godina.
# Kul godina! [% user_age = "[* 1]"]

Primjer postavljanja varijable na nulu:
$ Ne želim da pričaš o mojim godinama.
# Što god kažete [% user_age = ""]

Dodjela vrijednosti varijabli pomoću funkcije set

Funkcija set ("Argument1", "Argument2", "Argument3") zamjenjuje Argument2 umjesto njega i dodjeljuje njegovu vrijednost varijabli navedenoj u Argument1. Argument3 je prema zadanim postavkama prazan niz. Ako ga navedete osim praznog niza, tada se za postavljenu funkciju neće zamijeniti tekst, a bit će dodijeljena samo vrijednost varijable.

Na primjer,
$ moje ime je **
# Drago mi je što smo se upoznali, [@set ("user_name", "[@ (" [* 1] ")]")]!

Gost: moje ime je Vasya
Inf: Drago mi je, Vasya!

Ili:
$ moje ime je **
# Pamtit ću tvoje ime. [@set ("user_name", "[@ (" [* 1] ")]", "1")]

$ * što je * moje * ime *
# Vi ste [% user_name].

Gost: Moje ime je Lena
Inf: pamtit ću tvoje ime.
Gost: pa kako se ja zovem?
Inf: Ti si Lena.

Ispis vrijednosti varijable u odgovoru infa

Da bi inf "ozvučio" vrijednost varijable u odgovoru, samo trebate ovu varijablu upisati u odgovor.
Sintaksa:[%varijable]
Uglate zagrade su obavezne.

Primjer:
$ Zbogom, robote!
# Zbogom [% user_name]!

Uvjetna varijabla može se koristiti za implementaciju gore spomenutih sinkronizacijskih odnosa: početak-početak (CC), kraj-početak (FS), početak-završetak (SF) i cilj-završetak (FF). Ovaj odnos može postojati između niti istih ili različitih procesa. Popisi 5.4 i 5.5 prikazuju primjere implementacije FS i FF sinkronizacijskih odnosa. Svaki primjer definira dva muteksa. Jedan mutex se koristi za sinkronizaciju pristupa zajedničkim podacima, a drugi se koristi za sinkronizaciju izvršavanja koda.

// Listing 5.4. FS sinkronizacijski odnosi između

// dvije niti

pthread_t NitA, ThreadB;

pthread_cond_t događaj;

praznina * radnik1(prazno * X) (

for (int Count = l; Count

pthread_mutex_lock (& ​​Mutex);

pthread_mutex_unlock (& ​​Mutex);

ako (broj == 50) (

pthread_cond_signal (& Događaj);

praznina * radnik2(prazno * X) (

pthread_mutex_lock (& ​​EventMutex);

pthread_cond_wait (& Event, & EventMutex);

za (int broj = 1; broj

pthread_mutex_lock (& ​​Mutex);

Broj = Broj + 20;

pthread_mutex_unlock (& ​​Mutex);

cout "" Izvršenje funkcije worker2 je završilo." "Endl; povratak (0);

int glavni(int argc, char * argv) (

pthread_mutex_init (& Mutex, NULL);

pthread_mutex_init (& EventMutex, NULL);

pthread_cond_init (& Događaj, NULL);

pthread_create (& ThreadA, NULL, workerl, NULL);

pthread_create (& ThreadB, NULL, worker2, NULL);

Listing 5.4 prikazuje primjer implementacije FS sinkronizacije. ThreadA se ne može prekinuti dok se ThreadB ne pokrene. Ako broj postane 50, ThreadA to signalizira ThreadB. Sada može nastaviti izvršavanje do samog kraja. ThreadB ne može započeti izvršavanje dok ne primi signal od ThreadA. ThreadB koristi objekt EventMutex u sprezi s uvjetnom varijablom Event. Mutex objekt se koristi za sinkronizaciju pristupa za pisanje vrijednosti dijeljene varijable Number. Zadatak može koristiti više muteksa za sinkronizaciju različitih događaja i pristup kritičnim odjeljcima.

Primjer implementacije FF sinkronizacijskih odnosa prikazan je u Listingu 5.5.

// Listing 5.5. FF sinkronizacijski odnosi između // dvije niti

pthread_t NitA, ThreadB;

pthread_mutex_t Mutex, EventMutex;

pthread_cond_t događaj;

void * radnik (void * X) (

for (int Count = l; Count

pthread_mu tex_l ock (& ​​Mutex);

pthread_mutex_unlock (& ​​Mutex);

cout "" radnik: broj je "

pthread_mutex_lock (& ​​EventMutex), -

cout "" Workerl funkcija je na čekanju. "" Endl;

pthread_cond_wait (& Event, & EventMutex);

pthread_mutex_unlock (& ​​EventMutex);

nevažeći * radnik2 (nevažeći * X) (

for (int Count = l; Count

pthread_mutex_lock (& ​​Mutex);

Broj = Broj * 2;

pthread_mutex_unlock (& ​​Mutex);

cout "" worker2: broj je "" Broj "endl;

pthread_cond_signal (& Događaj);

cout "" Funkcija worker2 poslao je signal "" endl; return (0);

int main (int argc, char * argv) (

pthread_mutex_init (& Mutex, NULL);

pthread_mutex_init (& EventMutex, NULL);

pthread_cond_init (& Događaj, NULL);

pthread_create (& ThreadA, NULL, workerl, NULL);

pthread_create (& ThreadB, NULL, worker2, NULL);

U Listingu 5.5, ThreadA se ne može prekinuti dok se ThreadB ne završi. ThreadA mora petlju 10 puta, a ThreadB mora petlju 100. ThreadA će dovršiti svoje iteracije prije ThreadB, ali će pričekati dok ThreadB ne signalizira svoj završetak.

CC i SF vremenski odnosi ne mogu se implementirati na ovaj način. Ove metode se koriste za sinkronizaciju pora Ja sam vrijeme izvršavanja Ja sam procesa.

TAU - teorija automatskog upravljanja

TS - tehnički sustav

OU - kontrolni objekt

UU - upravljački uređaj

SU - sustav upravljanja

IO - izvršni organ

IU - izvršni uređaj

D - senzor

OS - povratna informacija

PC - prijenosni omjer

PF - prijenosna funkcija

APFC - amplitudno-fazni frekvencijski odziv

Frekvencijski odziv - amplitudno-frekvencijska karakteristika

LFCH - logaritamska amplitudno-frekvencijska karakteristika

Fazno-frekvencijska karakteristika - fazno-frekvencijska karakteristika

2. Simboli osnovnih varijabli i funkcija

x(t) - ulazni signal CS elementa, izlazni signal OS i CS (kontrolirana vrijednost)

y(t) Je li izlazni signal CS elementa, ulazni signal OS (kontrolno djelovanje)

x s ( t) Je li utjecaj na podešavanje upravljačkog sustava

z(t) Je li ometajući učinak na upravljački sustav

(t) - signal greške (neusklađenost) u upravljačkom sustavu

1(t) - radnja u jednom koraku

(t) - jednostruko impulsno djelovanje

x m ,y m- amplitudske vrijednosti signala x(t) i y(t)

str - Laplaceov operator, operator diferencijacije

 - kružna frekvencija, operator Fourierove transformacije

x(str) - kontinuirana slika signala x(t) prema Laplaceu

x(j) - kontinuirani prikaz signala x(t) prema Fourieru

k - PC veza (ili veze veze)

W(str) - PF veza (ili veza veza)

W(j) - AFC veze (ili veza veza)

A() - AFC veze (ili veza veza)

 () - fazno-frekvencijska karakteristika veze (ili veze veza)

F ( R) - PF zatvorenog sustava upravljanja

h(t) - prijelazna funkcija (karakteristika) veze ili upravljačkog sustava

w(t) - impulsna (težina) funkcija (karakteristika) veze ili CS-a

UVOD

Teorija automatskog upravljanja (TAU)- znanstvena disciplina čiji su predmet informacijski procesi koji se odvijaju u sustavima upravljanja tehničkim i tehnološkim objektima. TAU otkriva opće obrasce funkcioniranja automatskih sustava različite fizičke prirode i na temelju tih obrazaca razvija principe izgradnje visokokvalitetnih sustava upravljanja.

Pri proučavanju upravljačkih procesa u TAU apstrahiraju od fizičkih i projektnih značajki sustava i umjesto stvarnih sustava razmatraju njihove adekvatne matematičke modele. Što točnije (potpunije) matematički model odgovara fizičkim procesima koji se odvijaju u stvarnom sustavu, to će projektirani sustav upravljanja biti savršeniji.

Glavne metode istraživanja na TAU-u su matematičko modeliranje, teorija običnih diferencijalnih jednadžbi, operativni račun i harmonijska analiza. Pogledajmo na brzinu svaki od njih.

Metoda matematičkog modeliranja, kombinirajući široku paletu metoda i tehnika za opisivanje i prezentaciju fizičkih objekata i pojava, može se uvjetno, shematski prikazati korištenjem najčešće korištene tehnike - grafičke slike jednostavnog objekta s jednim ulaznim signalom. x(t) i jedan izlazni signal y(t), u obliku pravokutnika (slika B. 1, a). Simbol A unutar pravokutnika znači neki matematički operator (funkcija, integral itd.) koji povezuje ulazne i izlazne signale koji se mijenjaju u vremenu.

Riža. U 1. Shematski prikaz matematičkih metoda korištenih u TAU-u

Teorija običnih diferencijalnih jednadžbi, usredotočujući se na fizičke aspekte i primjenu dobivenih rješenja, služi kao glavna metodološka osnova TAU-a, a same obične diferencijalne jednadžbe su najopćenitiji i najpotpuniji oblik matematičkog opisa elemenata i upravljačkih sustava. Diferencijalne jednadžbe povezuju vremenski promjenjive ulazne i izlazne varijable i njihove derivate. U najjednostavnijem slučaju, diferencijalna jednadžba ima oblik

dy(t)/dt=f[x(t),y(t)]. (U 1)

Metoda operativnog računa, koji se temelji na Laplaceovoj transformaciji

(U 2)

omogućuje vam algebriziranje diferencijalnih jednadžbi - idite na tzv. operatorske jednadžbe povezujući slike x(str) i Y(str) ulaznih i izlaznih signala kroz prijenosnu funkciju W(str) (slika B. 1, b)

W(str)=Y(str)/x(str). (AT 3)

Metoda harmonijske analize temelji se na Fourierovoj transformaciji poznatoj iz kolegija matematike koja ima oblik

(AT 4)

Pomoću Fourierove transformacije (V. 4), slike se pronalaze x(j) i Y(j) ulazni i izlazni signali x(t) i y(t) karakterizirajući frekvencijske spektre ovih signala. Slike Fourierovih signala su povezane (slika B. 1, v) prijenosna funkcija frekvencije

W(j) = Y (j) / X (j). (AT 5)

Sve četiri metode, ukratko prikazane gore, čine matematički aparat TAU-a. Na temelju toga razvijen je kompleks "vlastitih" metoda TAU-a, predstavljenih u ovom kolegiju.

TAU zajedno s teorijom konstrukcije i funkcioniranja elemenata upravljačkih sustava (senzora, regulatora, aktuatora) čini širu granu znanosti – automatizaciju. Automatizacija je pak jedna od grana tehničke kibernetike. Tehnička kibernetika proučava složene automatizirane upravljačke sustave za tehnološke procese (APCS) i poduzeća (APCS), izgrađene pomoću upravljačkih računala (CFM).

Tehnička kibernetika, uz biološka i socioekonomska, sastavni je dio kibernetike, koju je njezin utemeljitelj, američki matematičar N. Wiener, 1948. definirao kao znanost o upravljanju i komunikaciji u tehničkim sustavima i živim organizmima.

Prvi industrijski regulatori pojavili su se između 1765. i 1804. godine. (I. Polzunov, J. Watt, J. Jacquard).

Prve teorijske studije regulatora pojavile su se u razdoblju 1868-1893. (J. Maxwell, I. Vyshnegradsky, A. Stodola). Ruski znanstvenik i inženjer I.A.Vyshnegradskii proveo je niz znanstvenih studija u kojima su parni stroj i njegov regulator prvi put analizirani matematičkim metodama kao jedinstveni dinamički sustav. Djela A. A. Andronova, V. S. Kulebakina, I. N. Voznesenskog, B. V. Bulgakova, A. A. Feldbauma, B. N. Petrova, N. N. Krasova odigrala su važnu ulogu u formiranju ruske škole TAU. , AA Voronova, Ya. Z. Tsypkina, VS Pugache ...

Razvoj suvremene teorije upravljanja iz takozvane "klasične" teorije regulacije, temeljene na četiri gore navedene temeljne metode istraživanja TAU-a, te formiranje njezinih najnovijih metoda shematski su prikazani na sl. U 2.

Riža. U 2. Razvoj sadržaja i metodologije teorije upravljanja

Trenutno, TAU, zajedno s najnovijim dijelovima opće teorije upravljanja (operativno istraživanje, inženjering sustava, teorija igara, teorija čekanja), igra važnu ulogu u poboljšanju i automatizaciji upravljanja tehnološkim procesima i industrijama.

Uvjetne varijable

Varijabla uvjeta (condvar - skraćenica od varijabla uvjeta) koristi se za blokiranje niti za bilo koji uvjet tijekom izvršavanja kritičnog dijela koda. Uvjet može biti složen koliko god želite i ne ovisi o uvjetnoj varijabli. Međutim, varijabla uvjeta uvijek se treba koristiti zajedno s mutexom za testiranje uvjeta.

Uvjetne varijable podržavaju sljedeće funkcije:

Čekanje na uvjetnu varijablu (čekajte) ( pthread_cond_wait ());

Deblokiranje jednog toka (signal) ( pthread_cond_signal ())

Deblokiranje višestrukih streamova (emitiranje) ( pthread_cond_broadcast ()),

Evo primjera tipične upotrebe varijable uvjeta:

pthread_mutex_lock (& ​​m); - ...

dok (! proizvoljan uvjet) (

pthread_cond_wait (& cv, & m);

pthread_mutex_unlock (& ​​m);

U ovom primjeru, hvatanje mutexa događa se prije provjere uvjeta. Dakle, provjereni uvjet se odnosi samo na trenutnu nit. Sve dok je ovaj uvjet istinit, ovaj dio koda blokira poziv čekanja dok neka druga nit ne izvede operaciju deblokiranja jedne ili više niti na varijablu uvjeta.

Dok petlja u gornjem primjeru potrebna je iz dva razloga. Prvo, posix standardi ne jamče da nema lažnih buđenja (na primjer, na višeprocesorskim sustavima). Drugo, ako neka druga nit promijeni uvjet, morate je ponovno testirati kako biste bili sigurni da promjena zadovoljava prihvaćene kriterije. Kada je nit koja čeka blokirana, funkcija atomski oslobađa mutex povezan s uvjetnom varijablom pthread_cond_wait () tako da druga nit može ući u kritični dio programskog koda.

Nit koja izvodi jedno deblokiranje na niti deblokirat će nit najvišeg prioriteta koja je u redu čekanja na varijablu uvjeta. Operacija otključavanja više niti otključava sve niti u redu čekanja na uvjetnoj varijabli. Mutex povezan s uvjetnom varijablom oslobađa atomski deblokirana nit s najvišim prioritetom. Nakon obrade kritičnog dijela koda, ova nit mora osloboditi mutex.

Druga vrsta operacije koja čeka uvjetnu varijablu ( pthread__cond_timedwair ()) omogućuje postavljanje vremenskog ograničenja. Na kraju tog razdoblja, nit čekanja može se deblokirati.

Barijere

Barijera je mehanizam sinkronizacije koji vam omogućuje koordiniranje rada nekoliko interakcijskih niti na takav način da se svaka od njih zaustavlja u određenoj točki dok čeka druge niti prije nego što nastavi svoj rad.

Za razliku od funkcije pthreadjoin () u kojem nit čeka da se završi druga nit, barijera prisiljava niti upoznati u određenom trenutku. Nakon što navedeni broj niti dosegne postavljenu barijeru, svi ove niti će se deblokirati i nastaviti s radom. Barijera se stvara pomoću funkcije pthread_barrier_init ():

#uključiti

pthread_barrier_init (pthread_barrier_t * barijera, const pthread_barrierattr_t * attr, unsigned int count);

Kao rezultat izvršavanja ovog koda, na zadanoj adresi se stvara barijera (pokazivač na barijeru je u argumentu barijere) i s atributima postavljenim argumentom attr. Argument count specificira broj niti za pozivanje pthread_barrier_wait ().

Nakon što je barijera stvorena, svaka nit poziva funkciju pthread_barrier_wait (), čime signalizira završetak ove radnje:

#uključiti

int pthread_barrier_wait (pthread_barrier_t "barijera);

Kada nit pozove funkciju pthread_barrier_wait (), blokira se do broja niti koji je specificirao funkcija pthread_barrier_init (), neće pozvati funkciju pthread_jbarrier_wait () i, sukladno tome, neće biti blokiran. Nakon navedenog broja niti poziva funkciju pthread_barrier_wait (), svi se otključavaju istovremeno.

#uključiti

#uključiti

#uključiti

#uključiti

pthread_barrier_t barijera; // sinkronizacijski objekt tipa "barijera".

main () // zanemarimo argumente

time_t sada; // stvorite barijeru s vrijednosti brojača 3

pthread_barrier_init (& barijera, NULL, 3); // pokreće dvije niti - threadl i thread2

pthread_create (NOLL, NOLL, threadl, NULL); // izvršavaju se niti threadl i thread2

pthread_create (NDLL, NDLL, thread2, NDLL); // čekati završetak

printf ("main () čeka barijeru na% s", ctime (& sada));

pthread_barrier_wait (& barrier); // nakon ove točke sve tri niti su prekinute

printf ("barijera u mainO učinjena na% s", ctime (& sada));

navoj (praznina * nije korištena)

vrijeme (& sada); // obavljati izračune

printf ("threadl starting at% s", ctime (& sada)); // pauza

pthread_barrier_wait (& barrier); // nakon ove točke sve tri niti su prekinute

printf ("barijera u threadl () učinjeno na% s", ctime (& sada));

nit2 (nevažeći * nije__upotrijebljen)

vrijeme (& sada); // obavljati izračune

printf ("thread2 starting at% s", ctime (& sada)); // pauza

pthread_barrier_wait (& barijera);

// nakon ove točke sve tri niti su gotove

printf ("barijera u thread2 () učinjeno na% s", ctime (& sada));

U primjeru iz listinga, glavna nit stvara barijeru, nakon čega počinje brojati broj niti blokiranih na barijeri za sinkronizaciju. U ovom slučaju, broj sinkroniziranih niti je postavljen na 3: glavna () nit, nit1 () i nit2 ().

Pokreću se niti thread1 () i thread2 (). Radi jasnoće, u toku je postavljena pauza za simulaciju procesa izračunavanja. Za izvođenje sinkronizacije, glavna nit se blokira na barijeri i čeka na deblokiranje koje se događa nakon što joj se druge dvije niti ne pridruže na ovoj barijeri.



Zaključavanja na čekanju

Sleepon brave rade na sličan način kao i uvjetne varijable, osim nekoliko detalja. Poput uvjetnih varijabli koje čekaju zaključavanje ( pthread_sleepon_lock ()) može se koristiti za blokiranje niti dok uvjet ne postane istinit (slično promjeni vrijednosti memorijske lokacije). Ali za razliku od uvjetnih varijabli (koje moraju postojati za svaki uvjet koji se provjerava), zaključavanja na čekanju se primjenjuju na jedan mm.text i dinamički kreiranu uvjetnu varijablu, bez obzira na broj uvjeta koji se testiraju. Maksimalni broj uvjetnih varijabli u konačnici je jednak maksimalnom broju blokiranih niti.

Vrhunski povezani članci