Citat:
1. Koliko vremena "arči" zaključavanje jednog celog broja?
Pseudo kod (i veoma pojednostavljeno):
Code:
void SetBlah(int x) // sporo, shared memory mutex
{
mutex.lock;
g_x = x;
mutex.unlock;
}
// lw mutex == critical section
void SetBlah(int x) // brze, shared memory lightweight mutex
{
lwmutex.lock;
g_x = x;
lwmutex.unlock;
}
void SetBlah(int x) // shared memory atomic
{
atomicstore(&g_x, x);
}
void SetBlah(int x) // poruke, ali ako imaš veliki broj poruka može biti sporije od mutex-a
{
lffifo.push(SET_BLAH, x);
}
void SetBlah(int x) // shared memory, lazy ili deferred (odloženo), i najbrže, ali zahteva više memorije
{
g_x[writebuffer] = x;
}
Prve tri verzije moraju zaključati vrednosti i tokom čitanja. A npr. u ovom predzadnjem slucaju nit koja cita ove poruke ne mora da ima pristup RAM i ne mora da zaključa promenljivu tokom čitanja, ili cak ne mora da bude na istom procesoru, recimo ako kreiras interfejs koji šalje ove poruke preko mreže na drugi kompjuter koji obrađuje podatke i vraća samo rezultat...
Sada ovaj kod uopšte ne garantuje nikakvu sigurnost kada radiš sa više niti. Jedino što garantuje je da su promene tih vrednosti sigurne.
Recimo (mutex, lwmutex, atomic verzije, početno stanje g_x je 5):
Nit1
SetBlah(10);
SetBlah(20);
SetBlah(30);
Nit2
x = GetBlah(); // možda 5, 10, 20, 30
SetBlah(x+5);
x = GetBlah(); // možda 10, 15, 25, 35?
SetBlah(x+5);
x = GetBlah(); // možda 15, 20, 25, 30, 35, 40?
SetBlah(x+5);
LFFIFO verzija (2x LFFIFO, jedan za nit1->nit2 i jedan nit2->nit1):
Nit1
SetBlah(10);
SetBlah(20);
SetBlah(30);
Nit2
x = GetBlah(); // 10
SetBlah(x+5);
x = GetBlah(); // 20
SetBlah(x+5);
x = GetBlah(); // 30
SetBlah(x+5);
Zadnja verzija je u slučaju kada te promena stanja ne zanima, nego ti treba samo zadnje stanje:
Nit1
SetBlah(10);
SetBlah(20);
SetBlah(30);
Wait(Nit2 da završi);
Flip( zameni read i write buffer )
Nit2
x = GetBlah(); // 30
SetBlah(x+5);
x = GetBlah(); // 35
SetBlah(x+5);
x = GetBlah(); // 40
SetBlah(x+5);
Post(Nit2 kraj);
Citat:
2. Kako ostvariti slanje poruka drugim nitima u jeziku C++?
Lock Free FIFO. Lock Free znači da koristiš atomic operacije nad PUT i GET pointerom. Kod FIFO-a kada je PUT == GET to znači da je FIFO prazan. Sada možeš da tretiraš PUT i GET kao 16-bit vrednosti pa da pristupaš preko jedne 32-bitne atomic operacije, ili da ih tretiraš kao pointere i da pristupaš preko 64-bitne atomic operacije. Bitno je da uvek pristupaš PUT i GET zajedno sa jednom atomic operacijom jer se vrednost može promeniti između dve atomic operacije.