Kako podesiti pametne telefone i računare. Informativni portal

Dodatak. ActionScript osnove

Da bi se logika mogla implementirati u program, koriste se uvjetni operatori. Konceptualno, ovi operatori se mogu predstaviti kao čvorne tačke, dostižući koje program bira u kom od mogućih pravaca da se kreće dalje. Na primjer, trebate odrediti da li neka varijabla arg sadrži 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 naredbu je sljedeća:

ako (izraz)

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

Tabela 2.1. Jednostavni logički izrazi

Dajemo primjer korištenja if operatora grananja. Sljedeći program vam omogućava da odredite predznak unesene varijable.

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

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

Povratak 0;
}

Analiza datog programskog teksta pokazuje da se dva uslovna operatora mogu zameniti 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 dati primjer određivanja predznaka broja pomoću ove konstrukcije.

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

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

Povratak 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 uslov ispunjen, moraju se koristiti vitičaste zagrade, tj. koristite konstrukciju poput

ako (izraz)
{

}
ostalo
{

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

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

Listing 2.3 prikazuje program koji implementira posljednju konstrukciju uvjetnog grananja.

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

#include
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);
ostalo
printf (“Uneseni broj% f nije negativan. \ n”, x);

Povratak 0;
}

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

Na osnovu ove tri logičke operacije mogu se generisati složeniji uslovi. Na primjer, ako postoje tri varijable exp1, exp2 i exp3, onda one mogu činiti logičke konstrukcije predstavljene u tabeli. 2.2.

Tabela 2.2. Primjer složenih logičkih izraza

Kao i operacije množenja i sabiranja u matematici, logičke operacije I ILI NE, također imaju svoje prioritete. Operacija NE ima najveći prioritet, tj. takva operacija se prvo izvodi. Operacija AND ima niži prioritet, a konačno operacija OR ima najniži prioritet. Ovi prioriteti se moraju uzeti u obzir prilikom izrade složenih uslova. Na primjer, stanje

if (4 6 || 5 je testiran na ovaj način. If 4 6 OR 5 if (4 6 || 5 naredba if olakšava pisanje programa u kojima je potrebno birati između malog broja mogućih opcija. Međutim, ponekad program treba da odabere 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 C++ switch naredbu. sintaksa ovog operatora je sljedeća:

prekidač (varijabilan)
{
konstanta slučaja1:

Konstanta slučaja2:

...
zadano:

Ovaj operator sekvencijalno provjerava jednakost varijable sa konstantama iza ključne riječi case. Ako nijedna 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, izvršavanje programa će se nastaviti provjeravanjem varijable za jednakost konstante2, što često dovodi do nepotrebnog trošenja računarskih resursa. Da biste izbjegli ovu situaciju, trebali biste koristiti naredbu break da premjestite program na sljedeći izraz nakon prebacivanja.

Listing 2.4 pokazuje primjer programiranja izraza uslovnog prekidača.

Listing 2.4. Primjer korištenja naredbe switch.

#include
int main ()
{
int x;
printf (“Unesite broj:”);
scanf (“% d”, & x);
prekidač (x)
{
slučaj 1: printf (“Unesen broj 1 \ n”); break;
slučaj 2: printf (“Unesen broj 2 \ n”); break;
default: printf (“Unesen drugi broj \ n”);
}
char ch;
printf (“Unesite znak:”);
scanf ("% c", & ch);
prekidač (ch)
{
case 'a': printf ("Unesen je znak a \ n"); break;
slučaj 'b': printf ("Unesen znak b \ n"); break;
default: printf (“Unesen je još jedan znak \ n”);
}
return 0;
}

Ovaj primjer pokazuje dva različita slučaja upotrebe za naredbu switch. U prvom slučaju se analizira unesena cifra, u drugom se analizira uneti znak. Treba napomenuti da ovaj operator može napraviti izbor samo na osnovu jednakosti svog argumenta sa jednom od navedenih vrijednosti slučaja, tj. provjeravanje izraza kao što je x

Možete pohraniti znanje o sagovornicima ili bilo koju drugu tekstualnu informaciju. Sada, prilikom pisanja šablona, ​​možete koristiti 13 varijabli s unaprijed određenom namjenom i 100 „besplatnih“ koje vlasnici informacija mogu koristiti po vlastitom nahođenju.
Varijable sa datim ciljem imaju smislena imena. Na primjer, % korisničko_ime Je varijabla dizajnirana za pohranjivanje imena sagovornika. Njeno ime koristi engleske riječi user ("user") i name ("name"). Takve varijable programeri aktivno koriste prilikom kreiranja baze standardnih info šablona, ​​na osnovu 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.

Šta piše u šablonima Primjer dijaloga
Zapamti ime:
$ Moje ime je *
# Drago mi je što smo se upoznali. [% user_name = "[* 1]"]
gost: Moje ime je Vasya
Inf: Nađite se jednom.
U odgovoru na infa prikazujemo ime sagovornika:
$ Zbogom, inf.
# Zbogom, [% user_name]
gost:ćao, inf.
Inf: Zbogom Vasja.
Odabiremo odgovor ovisno o vrijednosti varijable % user_name:
$ Da li se sećate mog imena?
# (Naravno. Vi ste [% user_name].)
# (Ne. Nisi mi rekao svoje ime.)
gost: Sjećaš li se mog imena?
Inf: Svakako. Ti si Vasja.
ili
gost: Sjećaš li se mog imena?
Inf: br. Nisi mi rekao svoje ime.
Ne želimo više da čuvamo ime sagovornika, resetujemo varijablu
$ Ti si budala.
# To je to, nisam više prijatelj sa tobom i zaboravio sam tvoje ime. [% user_name = ""]
gost: Ti si budala.
Inf: To je to, nisam više prijatelj s tobom, 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:[% varijabla = "vrijednost"]
Komanda dodjeljivanja varijable je uvijek okružena uglastim zagradama, koji su ovdje simboli usluge. Vrijednost varijable je uvijek zatvorena pod navodnicima.
Primjeri dodjele vrijednosti:
$ Bavim se rokenrolom.
# Zavidim. INF ne mogu plesati [% var1 = "ples"]

$ * mrzim * plesanje *
$ * ples * mrzim *
$ * ne pleši *
# Steta. Da sam čovjek, definitivno bih plesao. [% var1 = "ne voli ples"]

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

Primjer postavljanja varijable na nulu:
$ Ne želim da pričaš o mojim godinama.
# Šta 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 podrazumevano je prazan string. Ako ga navedete osim praznog stringa, tada se za funkciju set neće zamijeniti tekst, već će biti dodijeljena samo vrijednost varijable.

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

gost: moje ime je Vasja
Inf: Drago mi je, Vasya!

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

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

gost: Moje ime je Lena
Inf: Zapamtiću tvoje ime.
gost: pa kako se zovem?
Inf: Ti si Lena.

Izlaz vrijednosti varijable u odgovoru infa

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

primjer:
$ Ćao, robote!
# Zbogom [% user_name]!

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

// Listing 5.4. FS sinhronizacijski odnosi između

// dvije niti

pthread_t ThreadA, ThreadB;

pthread_cond_t događaj;

praznina * radnik1(void * X) (

for (int Count = l; Count

pthread_mutex_lock (& ​​Mutex);

pthread_mutex_unlock (& ​​Mutex);

if (Broj == 50) (

pthread_cond_signal (& Event);

praznina * radnik2(void * X) (

pthread_mutex_lock (& ​​EventMutex);

pthread_cond_wait (& Event, & EventMutex);

for (int Count = 1; Count

pthread_mutex_lock (& ​​Mutex);

Broj = Broj + 20;

pthread_mutex_unlock (& ​​Mutex);

cout "" Izvršenje funkcije worker2 je završeno." "Endl; povratak (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);

Listing 5.4 pokazuje primjer implementacije FS sinhronizacije. 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 EventMutex objekat u sprezi sa uslovnom varijablom Event. Mutex objekat 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 dijelovima.

Primjer implementacije FF sinhronizacijskih relacija prikazan je u Listingu 5.5.

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

pthread_t ThreadA, 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);

void * radnik2 (void * 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 (& Event);

cout "" Funkcija worker2 poslao 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 ponoviti 10 puta, a ThreadB mora petlju 100. ThreadA će završiti svoje iteracije prije ThreadB, ali će č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 sinhronizaciju pora ja sam vrijeme izvršenja ja sam procesi.

TAU - teorija automatskog upravljanja

TS - tehnički sistem

OU - kontrolni objekt

UU - kontrolni uređaj

SU - sistem upravljanja

IO - izvršni organ

IU - izvršni uređaj

D - senzor

OS - povratne informacije

PC - omjer prijenosa

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 (kontrolisana vrijednost)

y(t) Je li izlazni signal CS elementa, ulazni signal OS (kontrolna akcija)

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

z(t) Da li je ometajući efekat na sistem upravljanja

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

1(t) - radnja u jednom koraku

(t) - jednostruko impulsno djelovanje

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

str - Laplasov operator, operator diferencijacije

 - kružna frekvencija, operator Fourierove transformacije

X(str) - kontinuirana signalna slika 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-frekventna karakteristika veze (ili veze veza)

F ( R) - PF zatvorenog sistema upravljanja

h(t) - prolazna funkcija (karakteristika) veze ili upravljačkog sistema

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

UVOD

Teorija automatskog upravljanja (TAU)- naučna disciplina čiji su predmet informacioni procesi koji se odvijaju u sistemima upravljanja tehničko-tehnološkim objektima. TAU otkriva opšte obrasce funkcionisanja automatskih sistema različite fizičke prirode i na osnovu ovih obrazaca razvija principe izgradnje visokokvalitetnih sistema upravljanja.

Prilikom proučavanja upravljačkih procesa u TAU apstrahuju od fizičkih i projektnih karakteristika sistema i umjesto stvarnih sistema razmatraju njihove adekvatne matematičke modele. Što preciznije (potpunije) matematički model odgovara fizičkim procesima koji se odvijaju u realnom sistemu, to će projektovani sistem 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. Hajde da na brzinu pogledamo svaki od njih.

Metoda matematičkog modeliranja, kombinujući široku lepezu metoda i tehnika za opisivanje i predstavljanje fizičkih objekata i pojava, može se uslovno, shematski prikazati korišćenjem najčešće korišćene tehnike - grafičke slike jednostavnog objekta sa jednim ulaznim signalom. x(t) i jedan izlazni signal y(t), u obliku pravougaonika (sl. B. 1, a). Simbol A unutar pravougaonika označava neki matematički operator (funkcija, integral, itd.) koji povezuje ulazne i izlazne signale koji se mijenjaju u vremenu.

Rice. U 1. Šematski prikaz matematičkih metoda koje se koriste u TAU

Teorija običnih diferencijalnih jednadžbi, fokusirajući se na fizičke aspekte i primjene dobijenih rješenja, služi kao glavna metodološka osnova TAU-a, a same obične diferencijalne jednadžbe su najopštiji i najpotpuniji oblik matematičkog opisa elemenata i upravljačkih sistema. Diferencijalne jednadžbe odnose se na ulazne i izlazne varijable koje variraju u vremenu 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 je baziran na Laplaceovoj transformaciji

(IN 2)

omogućava vam da algebrizirate diferencijalne jednadžbe - idite na takozvane operatorske jednadžbe povezujući slike X(str) i Y(str) ulaznih i izlaznih signala kroz prijenosnu funkciju W(str) (sl. B. 1, b)

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

Metoda harmonične analize zasniva se na Fourierovoj transformaciji poznatoj iz kursa matematike, koja ima oblik

(AT 4)

Koristeći Fourierovu transformaciju (V. 4), slike su pronađene X(j) i Y(j) ulazni i izlazni signali x(t) i y(t) karakterizira frekventne spektre ovih signala. Slike Fourierovih signala su povezane (slika B. 1, v) funkcija prijenosa frekvencije

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

Sve četiri metode, ukratko prikazane gore, čine matematički aparat TAU. Na osnovu njega je razvijen kompleks „vlastitih“ metoda TAU-a, predstavljenih u ovom kursu.

TAU zajedno sa teorijom konstrukcije i funkcionisanja elemenata upravljačkih sistema (senzora, regulatora, aktuatora) čini širu granu nauke – automatizaciju. Automatizacija je, pak, jedna od grana tehničke kibernetike. Tehnička kibernetika proučava složene automatizovane sisteme upravljanja za tehnološke procese (APCS) i preduzeća (APCS), izgrađene pomoću upravljačkih računara (CFM).

Tehnička kibernetika je, uz biološka i socioekonomska, sastavni dio kibernetike, koju je njen osnivač, američki matematičar N. Wiener, 1948. godine definisao kao nauku o kontroli i komunikaciji u tehničkim sistemima 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 periodu 1868-1893. (J. Maxwell, I. Vyshnegradsky, A. Stodola). Ruski naučnik i inženjer I.A.Vyshnegradskii sproveo je niz naučnih studija u kojima su parna mašina i njen regulator prvi put analizirani matematičkim metodama kao jedinstveni dinamički sistem. Radovi A. A. Andronova, V. S. Kulebakina, I. N. Voznesenskog, B. V. Bulgakova, A. A. Feldbauma, B. N. Petrova, N. N. Krasova odigrali su važnu ulogu u formiranju ruske škole TAU. , AA Voronova, Ya. Z. Tsypkina, VS Pugache ...

Razvoj moderne teorije upravljanja iz takozvane "klasične" teorije regulacije, zasnovane na četiri gore navedene osnovne metode istraživanja TAU, i formiranje njenih najnovijih metoda šematski su ilustrovani na Sl. U 2.

Rice. U 2. Razvoj sadržaja i metodologije teorije menadžmenta

Trenutno, TAU, zajedno sa najnovijim sekcijama opšte teorije menadžmenta (operativno istraživanje, sistemski inženjering, teorija igara, teorija čekanja), igra važnu ulogu u poboljšanju i automatizaciji kontrole tehnoloških procesa i industrija.

Uslovne varijable

Varijabla stanja (condvar - skraćenica za promjenjivu stanja) se koristi za blokiranje niti za bilo koji uvjet tokom izvršavanja kritičnog dijela koda. Uslov može biti složen koliko god želite i ne zavisi od uslovne varijable. Međutim, varijabla uslova bi se uvijek trebala koristiti zajedno s mutexom za testiranje stanja.

Uslovne varijable podržavaju sljedeće funkcije:

Čeka se uslovna varijabla (čekaj) ( pthread_cond_wait ());

Deblokiranje jednog toka (signal) ( pthread_cond_signal ())

Deblokiranje višestrukih tokova (emitovanje) ( pthread_cond_broadcast ()),

Evo primjera tipične upotrebe varijable uslova:

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

dok (! proizvoljan uslov) (

pthread_cond_wait (& cv, & m);

pthread_mutex_unlock (& ​​m);

U ovom primjeru, hvatanje mutexa se događa prije nego što se uvjet provjeri. 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 je potrebna iz dva razloga. Prvo, posix standardi ne garantuju da nema lažnih buđenja (na primjer, na višeprocesorskim sistemima). Drugo, ako druga nit promijeni uvjet, morate je ponovo testirati kako biste bili sigurni da promjena ispunjava prihvaćene kriterije. Kada je nit na čekanju blokirana, funkcija mutex povezana s uvjetnom varijablom atomski oslobađa pthread_cond_wait () tako da druga nit može ući u kritični dio programskog koda.

Nit koja izvodi jedno deblokiranje na niti će deblokirati nit najvišeg prioriteta koja je u redu na varijablu uvjeta. Operacija otključavanja više niti otključava sve niti u redu na uvjetnoj varijabli. Mutex povezan s uslovnom 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 uslovnu varijablu ( pthread__cond_timedwair ()) vam omogućava da postavite vremensko ograničenje. Na kraju ovog perioda, nit na čekanju se može deblokirati.

Barijere

Barijera je mehanizam sinhronizacije koji vam omogućava da koordinirate rad nekoliko interakcijskih niti na takav način da se svaka od njih zaustavi u datoj tač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 upoznaj u određenom trenutku. Nakon što navedeni broj niti dostigne postavljenu barijeru, sve ove niti će se deblokirati i nastaviti sa radom. Barijera se kreira pomoću funkcije pthread_barrier_init ():

#include

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

Kao rezultat izvršavanja ovog koda, na datoj adresi se kreira barijera (pokazivač na barijeru je u argumentu barijere) i sa 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 akcije:

#include

int pthread_barrier_wait (pthread_barrier_t "barijera);

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

#include

#include

#include

#include

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

main () // zanemarimo argumente

time_t now; // kreirati barijeru s vrijednosti brojača 3

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

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

pthread_create (NDLL, NDLL, thread2, NDLL); // čekamo 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 urađena na% s", ctime (& sada));

navoj (praznina * nije korištena)

vrijeme (& sada); // vršimo prorač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 () urađeno na% s", ctime (& sada));

thread2 (void * not__used)

vrijeme (& sada); // vršimo proračune

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

pthread_barrier_wait (& barrier);

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

printf ("barijera u thread2 () urađeno na% s", ctime (& sada));

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

Thread1 () i thread2 () su pokrenuti. Radi jasnoće, u toku je postavljena pauza kako bi se simulirao proces izračunavanja. Za izvršenje sinhronizacije, glavna nit se blokira na barijeri i čeka na deblokiranje do koje dolazi 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 uslovne varijable, osim nekoliko detalja. Kao uslovne varijable koje čekaju zaključavanje ( pthread_sleepon_lock ()) se može koristiti za blokiranje niti sve dok uvjet ne postane istinit (slično mijenjanju vrijednosti memorijske lokacije). Ali za razliku od uslovnih varijabli (koje moraju postojati za svaki uslov koji se testira), zaključavanja na čekanju se primenjuju na jedan mm.text i dinamički kreiranu uslovnu varijablu, bez obzira na broj uslova koji se testiraju. Maksimalni broj uslovnih varijabli na kraju je jednak maksimalnom broju blokiranih niti.

Top srodni članci