Kako podesiti pametne telefone i računare. Informativni portal

Aplikacija. Osnove ActionScript-a

Da bi se logika mogla implementirati u program, koriste se uvjetni izrazi. Spekulativno, ovi operatori se mogu predstaviti kao čvorne tačke, po dostizanju kojih program bira u kom od mogućih pravaca da se kreće dalje. Na primjer, želite da odredite da li neka varijabla arg sadrži pozitivan ili negativan broj i da prikažete odgovarajuću poruku na ekranu. Da biste to učinili, možete koristiti if naredbu, koja obavlja slične provjere.

U samom jednostavan slučaj Sintaksa ove if naredbe je sljedeća:

ako (izraz)

Ako je vrijednost parametra izraza tačna, naredba se izvršava, u suprotnom je program preskače. Treba napomenuti da "izraz" jeste uslovni izraz, u kojem se provjerava određeno stanje. U tabeli 2.1 predstavlja opcije za jednostavne logičkih izraza if izjava

Tabela 2.1. Jednostavni logički izrazi

Evo primjera korištenja if operatora grane. 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 gornjeg programskog teksta pokazuje da se dva uslovna izraza mogu zamijeniti jednim pomoću konstrukcije

ako (izraz)

što se ovako tumači. Ako je "izraz" tačan, 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 naredbi if i else postoji samo jedan printf funkcija(). U slučajevima kada je, kada je uslov ispunjen, potrebno napisati više od jednog operatora, potrebno je koristiti proteze, tj. koristiti konstrukciju poput

ako (izraz)
{

}
ostalo
{

Treba napomenuti da nakon ključa reči drugo formalno, možemo staviti još jedan uvjetni operator ako kao rezultat dobijemo još fleksibilniju konstrukciju uvjetnih prijelaza:

if(izraz1)
else if(izraz2)
ostalo

Listing 2.3 prikazuje program koji implementira posljednju konstrukciju uslovnog skoka.

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 if(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 jednostavnim uslovima tip x && - logičko 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 formirati logičke strukture predstavljene u tabeli. 2.2.

Tabela 2.2. Primjer složenih logičkih izraza

Slično operacijama množenja i sabiranja u matematici, logičke operacije I ILI NE takođe imaju svoje prioritete. Operacija NO ima najveći prioritet, tj. Ova operacija se prvo izvodi. Operacija AND ima najniž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 provjereno na ovaj način. Ako je 4 6 ILI 5 if(4 6 || 5 Uslovni rad if olakšava pisanje programa u kojima morate birati između mali broj moguće opcije. Međutim, ponekad je u programu potrebno odabrati jednu opciju od više mogućih. Formalno, možete koristiti if else if ... else konstrukciju za ovo. Međutim, u mnogim slučajevima se ispostavlja da je zgodnije koristiti C++ switch naredbu. Sintaksa ovog operatora je sljedeća:

prekidač (promjenljivo)
{
konstanta slučaja1:

Konstanta slučaja2:

...
zadano:

Ovaj operator sekvencijalno provjerava jednakost varijable u konstante, stoji nakon ključna riječ slučaj. Ako nijedna od konstanti nije jednaka vrijednosti varijable, tada se izvršavaju naredbe iza riječi default. Naredba switch ima sljedeću karakteristiku. Recimo da je vrijednost varijable jednaka vrijednosti konstante1 i naredbe nakon prve ključne riječi case se izvršavaju. Nakon toga, izvršavanje programa će se nastaviti provjeravanjem varijable da li je jednaka konstanti2, što često dovodi do neopravdanog 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 još jedan broj\n”);
}
char ch;
printf("Unesite znak: ");
scanf(“%c”,&ch);
prekidač (ch)
{
case 'a' : printf("Unesen je znak a\n"); break;
case 'b' : printf("Unesen je znak b\n"); break;
default: printf(“Unesen je još jedan znak\n”);
}
return 0;
}

Ovaj primjer demonstrira dva različite opcije koristeći naredbu switch. U prvom slučaju se analizira unesena cifra, u drugom slučaju se analizira uneseni simbol. Treba napomenuti da ovog operatera može napraviti izbor samo na osnovu jednakosti svog argumenta sa jednom od navedenih vrijednosti slučaja, tj. provjeravanje izraza kao što je x

Uslovne varijable

Varijabla uvjeta (condvar je skraćenica za promjenjivu stanja) koristi se za blokiranje niti na osnovu nekog uslova dok se izvršava kritični dio koda. Uvjet može biti složen koliko god želite i ne ovisi o varijabli uvjeta. Međutim, varijabla uvjeta uvijek se mora koristiti zajedno s mutexom za testiranje uvjeta.

Podrška za uslovne varijable sljedeće funkcije:

· čekanje na uslovnu varijablu (čekati) ( pthread_cond_wait());

· deblokiranje jednog toka (signal) ( pthread_cond_signal())

· deblokiranje višestrukih tokova (emitovanje) ( pthread_cond_broadcast()),

Evo primjera tipične upotrebe uslovne varijable:

pthread_mutex_lock (&m) ;-…

dok (! proizvoljan uslov) (

pthread_cond_wait(&cv, &m);

pthread_mutex_unlock (&m) ;

U ovom primjeru, mutex se preuzima prije provjere uvjeta. Na ovaj način, uvjet koji se testira primjenjuje se samo na trenutnu nit. ćao ovo stanje Istina, ovaj dio koda blokira poziv čekanja dok neka druga nit ne izvede operaciju deblokiranja jedne ili više niti na varijabli uvjeta.

while petlja u gornjem primjeru to je potrebno iz dva razloga. Prvo, posix standardi ne garantuju odsustvo lažnih buđenja (na primjer, na višeprocesorskim sistemima). Drugo, ako druga nit promijeni uvjet, mora se ponovo provjeriti kako bi se osiguralo da promjena ispunjava prihvaćene kriterije. Kada je nit na čekanju blokirana, funkcija atomski oslobađa muteks povezan s varijablom stanja pthread_cond_wait() tako da druga nit može ući u kritični dio programskog koda.

Nit koja izvodi jednostruko deblokiranje niti deblokira nit sa najviši prioritet, koji je u redu za promjenjivu uvjeta. Operacija deblokiranja više niti deblokira sve niti u redu čekanja na varijablu uvjeta. Mutex povezan sa varijablom uslova se atomski oslobađa od strane niti s najvišim prioritetom koji je deblokiran. Nakon obrade kritičnog dijela koda, ova nit mora osloboditi mutex.

Druga vrsta operacije čekanja uslovne varijable ( 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 tako da se svaka od njih zaustavi na dati poenčeka preostale niti prije nego što nastavi s radom.

Za razliku od funkcije pthreadjoin(), u kojem nit čeka da se završi druga nit, barijera forsira niti upoznaj u određenom trenutku. Jednom kada navedeni broj niti dosegne konfiguriranu barijeru, Sve ove teme će biti deblokirane i nastaviće sa radom. Barijera se kreira pomoću funkcije pthread_barrier_init():

#include

pthread_barrier_init (pthread_barrier_t *barijera, const pthread_barrierattr_t *attr, nepotpisani int broj);

Ovaj kod kreira barijeru na datoj adresi (pokazivač na barijeru je u argumentu barijere) i sa atributima postavljenim argumentom attr. Argument count specificira broj niti koje treba pozvati pthread_barrier_wait().

Nakon kreiranja barijere, svaka nit poziva funkciju pthread_barrier_wait() i time 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 specificiranih od strane funkcije pthread_barrier_init(), neće pozvati funkciju pthread_jbarrier_wait() i, shodno tome, neće biti blokirani. Nakon što je određeni broj niti pozvao funkciju pthread_barrier_wait(), svi su otključani istovremeno.

#include

#include

#include

#include

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

main() // zanemarimo argumente

time_t sada;// kreirati barijeru sa vrijednosti brojača 3

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

pthread_create(NOLL, NOLL, threadl, NULL); // threadl i thread2 su pokrenuti

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

printf("main() čekam barijera na %s", ctime (&sada));

pthread_barrier_wait (&barrier // nakon ove točke se prekidaju sve tri niti);

printf ("barijera u mainO urađena u %s", ctime (&sada));

navoj (praznina *ne koristi se)

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

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

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

printf ("barijera u threadl() urađena u %s", ctime (&now)) ;

thread2 (void *not__used)

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

printf ("nit2 počinje od %s", ctime (&sada) // pauza

pthread_barrier_wait (&barrier) ;

// nakon ove točke sve tri niti su završene

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

U primjeru iz listinga, glavna nit stvara barijeru, nakon čega počinje brojati broj niti blokiranih na barijeri za sinhronizaciju. IN u ovom slučaju broj sinhronizovanih niti je postavljen na 3: thread main(), thread thread1() i thread thread2().

Pokreću se niti thread1() i thread2(). Radi jasnoće, u toku je postavljena pauza kako bi se simulirao proces izračunavanja. Za izvršenje sinhronizacije, glavna nit je blokirana na barijeri i čeka na otključavanje, koje će se dogoditi nakon što joj se druge dvije niti ne pridruže na toj barijeri.



Čeka se blokiranje

Sleepon brave rade slično kao i varijable stanja, uz neke manje izuzetke. Kao i uslovne varijable koje čekaju zaključavanje ( pthread_sleepon_lock()) može se koristiti za blokiranje niti sve dok uvjet ne postane istinit (slično mijenjanju vrijednosti memorijske lokacije). Ali za razliku od varijabli uslova (koje moraju postojati za svaki uslov koji se testira), zaključavanje čekanja se primenjuje na jednu mm.tex i dinamički kreiranu varijablu uslova, bez obzira na broj uslova koji se testiraju. Maksimalni broj uslovnih varijabli na kraju bude maksimalan broj blokirane niti.

Možete pohraniti znanje o svojim sagovornicima ili bilo kom drugom tekstualne informacije. Sada, kada pišete šablone, možete koristiti 13 varijabli koje imaju unaprijed određenu svrhu i 100 „besplatnih“ koje vlasnici informacija mogu koristiti po vlastitom nahođenju.
Varijable sa zadatom svrhom imaju „kazujuća“ imena. Na primjer, %user_name je varijabla dizajnirana za pohranjivanje imena sagovornika. Koristi se u njeno ime engleske riječi korisnik ("korisnik") i ime ("ime"). Takve varijable programeri aktivno koriste prilikom kreiranja baze podataka standardnih predložaka informacija, na osnovu kojih se kreiraju sve korisničke informacije u projektu.
Životni vijek takvih varijabli nije ograničen, tj. njihova značenja se pamte i pohranjuju između pojedinačnih 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
Info: Jednom da te upoznam.
U informacijama o odgovoru prikazujemo ime sagovornika:
$ Zbogom, inf.
# Zbogom [%user_name]
Gost: Zbogom, inf.
Info: Zbogom Vasja.
Odgovor biramo u zavisnosti od 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?
Info: Svakako. Ti si Vasja.
ili
Gost: Sjećaš li se mog imena?
Info: br. Nisi mi rekao svoje ime.
Ne želimo više da pohranjujemo ime sagovornika, pa 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.
Info: To je to, nisam više prijatelj s tobom i zaboravio sam tvoje ime.

Dodjela vrijednosti varijabli i brisanje varijable

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

sintaksa:[%varijable = "vrijednost"]
Komanda za dodjelu varijable je uvijek okružena uglastim zagradama, koji su ovdje uslužni znakovi. Vrijednost varijable je uvijek u navodnicima.
Primjeri dodjele vrijednosti:
$ Plešem rokenrol.
# Ljubomoran sam. Infs ne može plesati [%var1="ples"]

$*mrzim*ples*
$*ples*mrziti*
$ *ne pleši*
# Steta. Da sam osoba, definitivno bih plesala. [%var1="ne voli ples"]

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

Primjer resetiranja varijable:
$ 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 i dodjeljuje njegovu vrijednost varijabli navedenoj u Argument1. Argument3 podrazumevano je prazan string. Ako ga navedete kao različit od prazan red, zatim na mestu postaviti funkcije tekst neće biti umetnut i 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
Info: Drago mi je, Vasya!

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

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

Gost: Moje ime je Lena
Info: Zapamtiću tvoje ime.
Gost: Pa, kako se zovem?
Info: Ti si Lena.

Prikaz vrijednosti varijable u infa odgovoru

Da bi informacija „izrazila“ vrijednost varijable u odgovoru, samo trebate upisati ovu varijablu u odgovor.
sintaksa:[%varijable]
Uglaste zagrade su obavezne.

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

TAU – teorija automatskog upravljanja

TS – tehnički sistem

OU - kontrolni objekat

UU - kontrolni uređaj

CS – sistem upravljanja

Izvršni organ - izvršni organ

IU – aktuator

D – senzor

OS - povratne informacije

PC – koeficijent prenosa

TF – prijenosna funkcija

AFC – amplitudno-fazni frekvencijski odziv

Frekvencijski odziv – amplitudno-frekvencijski odziv

LFC – logaritamska amplitudno-frekvencijska karakteristika

PFC - fazno-frekvencijski odziv

2. Konvencije glavnih varijabli i funkcija

x(t) – ulazni signal elementa upravljačkog sistema, izlazni signal op-pojačala i upravljačkog sistema (kontrolisana količina)

y(t) – izlazni signal elementa kontrolnog sistema, ulazni signal op-amp (upravljačka akcija)

x z ( t) – uticaj na podešavanje upravljačkog sistema

z(t) – ometajući uticaj na sistem upravljanja

(t) – signal greške (neusklađenosti) u upravljačkom sistemu

1(t) – udar u jednom koraku

(t) – jednostruko impulsno djelovanje

x m ,y mamplitudske vrijednosti signale x(t) I y(t)

str – Laplasov operator, operator diferencijacije

 - kružna frekvencija, operator Fourierove transformacije

X(str) – slika kontinuiranog signala x(t) prema Laplaceu

X(j) – slika kontinuiranog signala x(t) prema Fourieru

k – povezati PC (ili link vezu)

W(str) – PF veze (ili veza linkova)

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

A() – frekvencijski odziv veze (ili veze veza)

() – fazni odziv veze (ili veze veza)

F( R) – PF zatvorenog sistema upravljanja

h(t) – prelazna funkcija (karakteristika) veze ili upravljačkog sistema

w(t) – impulsna (težina) funkcija (karakteristika) veze ili upravljačkog sistema

UVOD

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

Kada proučavaju procese upravljanja u TAU, apstrahuju se od fizičkih i dizajnerskih karakteristika sistema i umjesto toga stvarni sistemi razmotriti njihove adekvatne matematičke modele. Što preciznije (potpunije) matematički model odgovara fizičkim procesima koji se dešavaju 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. Pogledajmo ukratko svaki od njih.

Metoda matematičkog modeliranja, koji kombinuje široku lepezu metoda i tehnika za opisivanje i predstavljanje fizičkih objekata i pojava, može se uslovno, shematski prikazati koristeći najčešće korišćenu tehniku ​​- grafički prikaz jednostavnog objekta koji ima jedan ulazni signal x(t) i jedan izlazni signal y(t), u obliku pravougaonika (sl. B. 1, A). Simbol A unutar pravougaonika znači neki matematički operator (funkcija, integral, itd.) koji povezuje ulazne i izlazne signale koji se mijenjaju tokom vremena.

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

Teorija običnih diferencijalnih jednadžbi, fokusirajući svoju pažnju na fizičke aspekte i primjene rezultirajućih 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)]. (IN 1)

Metoda operativnog računa, koji je baziran na Laplacevoj transformaciji

(AT 2)

omogućava vam da algebrizirate diferencijalne jednadžbe - idite na takozvane operatorske jednadžbe povezujući slike X(str) I Y(str) ulazne i izlazne signale kroz prijenosnu funkciju W(str) (Sl. B. 1, b)

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

Metoda harmonične analize na osnovu Fourierove transformacije poznate iz kurseva matematike, koja ima oblik

(AT 4)

Koristeći Fourierovu transformaciju (B. 4), slike su pronađene X(j) i Y(j) ulazni i izlazni signali x(t) I y(t), karakterizirajući frekvencijske spektre ovih signala. Fourierove slike 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 skup „vlastitih“ TAU metoda koje su predstavljene u ovom kursu.

TAU zajedno sa teorijom konstrukcije i rada elemenata upravljačkog 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 (CCM).

Tehnička kibernetika je, uz biološka i socioekonomska, sastavni dio kibernetike, koju je njen osnivač, američki matematičar N. Wiener, 1948. definirao kao nauku o kontroli i komunikacijama u tehnički sistemi i živih organizama.

Prvi industrijski regulatori pojavili su se u periodu 1765-1804. (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. Vyshnegradsky izveo je niz naučno istraživanje, u kojoj su parna mašina i njen regulator prvi put analizirani matematičkim metodama kao jedinstven dinamički sistem. Radovi A. A. Andronova, V. S. Kulebakina, I. N. Voznesenskog, B. V. Bulgakova, A. A. Feldbauma, B. N. Petrova, N. N. Krasovskog odigrali su veliku ulogu u formiranju ruske škole TAU, A. A. Voronove, Y. Z. Puge, V. S. ...

Razvoj moderne teorije upravljanja iz takozvane „klasične“ teorije upravljanja, zasnovane na gore navedene četiri glavne metode TAU istraživanja, 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 najnovije sekcije opšta teorija upravljanja (operativno istraživanje, sistemski inženjering, teorija igara, teorija čekanja) igra vitalnu ulogu u poboljšanju i automatizaciji upravljanja tehnološkim procesima i proizvodnjom.

Varijabla uvjeta može se koristiti za implementaciju sinkronizacijskih odnosa spomenutih gore: start-start (CC), završetak-start (FS), start-finish (SF) i završetak-finish (FF). Ovi odnosi mogu postojati između niti istih ili različitih procesa. Liste 5.4 i 5.5 pružaju 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 Broj = l; Broj

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 Broj = 1; Broj

pthread_mutex_lock(&Mutex);

Broj = Broj + 20;

pthread_mutex_unlock(&Mutex);

cout ""Radnik funkcije2 je završio izvršenje." "endl; return(0);

int main(int argc, char *argv) (

pthread_mutex_init(&Mutex,NULL);

pthread_mutex_init(&EventMutex,NULL);

pthread_cond_init(&Event, NULL);

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

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

Listing 5.4 pokazuje primjer implementacije FS sinhronizacijskih odnosa. ThreadA se ne može prekinuti dok se ThreadB ne pokrene. Ako broj postane 50, ThreadA to signalizira ThreadB. Sada može nastaviti s izvršavanjem do samog kraja ThreadB ne može započeti izvršavanje dok ne primi signal od ThreadA. ThreadB koristi EventMutex objekat zajedno sa promenljivom uslova događaja. 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 dijelovima.

Primjer implementacije FF sinhronizacijskih odnosa je prikazan u Listingu 5.5.

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

pthread_t ThreadA, ThreadB ;

pthread_mutex_t Mutex, EventMutex;

pthread_cond_t Događaj;

void *workerl(void *X) (

for(int Broj = l; Broj

pthread_mu tex_l ock (&Mutex);

pthread_mutex_unlock(&Mutex);

cout ""workerl: broj je "

pthread_mutex_lock(&EventMutex) ,-

cout "Workerl funkcija čeka. " "endl;

pthread_cond_wait (&Event, &EventMutex) ;

pthread_mutex_unlock(&EventMutex);

void *worker2 (void *X) (

for(int Broj = l; Broj

pthread_mutex_lock(&Mutex) ;

Broj = Broj * 2 ;

pthread_mutex_unlock(&Mutex) ;

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

pthread_cond_signal (&Event) ;

cout ""Funkcija Worker2 poslala je signal" " endl;

int main(int argc, char *argv) (

pthread_mutex_init (&Mutex,NULL) ;

pthread_mutex_init (&EventMutex,NULL) ;

pthread_cond_init (&Event, 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 dovršiti petlju 10 puta, a ThreadB mora dovršiti petlju 100 puta.

CC i SF sinhronizacijski odnosi ne mogu se implementirati Na sličan način. Ove metode se koriste za sinhronizaciju pora I vrijeme izvršenja I procesi.

Najbolji članci na ovu temu