[ bobby63 @ 26.02.2009. 21:39 ] @
Poz svima

Imam u programu 2 thread-a
Prvi radi non stop(petlja) i sluzi za komunikaciju a drugi kontrolise neke procese.
Kada drugi thread zatreba neki info on posalje zahtev i udje u petlju gde ceka vrednost varijable koja mu treba i koja se generise u prvom thread-u.

Varijabla je integer i definisana je kao
Code:
Public Shared Vrednost as Integer

Problem je sto se nova vrednost te varijable (vrednost setuje thread 1) u threadu 2 promeni tek kada dodam
Code:
Application.doevents


Pitanje je kako da se refresuje vrednost varijable bez
Code:
Application.doevents
[ Toxter @ 26.02.2009. 22:39 ] @
U c# za to sluzi volatile keyword.
E sad, mislim da ovo nema u VB.NET ali ovo ti je hint sta da googlas :)

Pozdrav
[ bobby63 @ 27.02.2009. 01:21 ] @
Da da to je to i jeste tacno da nema u VB
Hvala puno
Ako nekome treba VB implementacija je:
Code:
Function VolatileRead(Of T)(ByRef Address As T) As T
    VolatileRead = Address
    Threading.Thread.MemoryBarrier()
End Function

Sub VolatileWrite(Of T)(ByRef Address As T, ByVal Value As T)
    Threading.Thread.MemoryBarrier()
    Address = Value
End Sub
[ mmix @ 27.02.2009. 14:21 ] @
Kakve veze ima volatile sa application.doevents? ovo ce pre biti neki drugi problem. Na koji nacin thread1 setuje vrednost?
[ Toxter @ 27.02.2009. 21:20 ] @
Citat:
mmix: Kakve veze ima volatile sa application.doevents? ovo ce pre biti neki drugi problem. Na koji nacin thread1 setuje vrednost?


Ima direktne veze.

Edit: Sa DoEvents nema, ali sa izmenom vrednosti iz drugog thread-a ima direktne veze.

Pozdrav
[ bobby63 @ 27.02.2009. 21:23 ] @
Pa application.doevents valjda tera aplikaciju da zavrsi sve poslove koje bi noramalno uradila tek kad dodje u idle stanje, tj kad ne radi nista. Pretpostavljam da je jedan od tih poslova i da prebaci tu varijablu iz nekog privremenog registra (ili gde se vec nalazi) na njeno pravo mesto.

U normalnim uslovima varijabla promenjena u nezavisnom threadu se setuje trenutno ali ne i ako je glavni thread zauzet, tj ako se nalazi u nekoj petlji koja duze traje.

A vrednost varijable sam do sada setovao normalno, npr vrednost = 2, a sada ide preko ovog VolatileWrite a citanje preko VolatileRead i to sada radi kako treba bez application.doevents.
[ mmix @ 27.02.2009. 22:46 ] @
Mislim da niste bas 100% skopcali sta je volatile field a isto se moze lako videti iz vb.net implementacije, volatile znaci samo da je SVE sto je sekvencijalno upisano u memoriju pre volatile polja sigurno i uslo u memoriju PRE volatile polja, sto ima smisla ako i samo ako koristis volatile polje za sinhronizaciju threadova (sto bobby radi) pa hoces da se osiguras da je sve ono sto je uradjeno PRE signalovanja "Vrednost" polja vec u memoriji da drugi thread moze da ga procita.


Dakle, volatile nije bio problem ovde jer je polje vrednost sasvim sigurno bilo promenjeno (i nikakav doevents mehanizam nije ukljucen u tu pricu, doevent zoves u glavnom threadu da ti aplikacija ne bi postala unresponsive). ja bih ti inace toplo preporucio da ne radih sinhronizaciju threadova kroz volatiole polja, cak i u najgrdjoj varijanti sa signalizacijom flegovima bolje koristi lock() tj critical sections. To sto volatile int kod tebe radi kao efektivna interlocked operacija ne znaci da ce isto raditi na svim platformama (npr 16bit). Bila je poprilicna tema oko ovoga na AoP.
[ sallle @ 01.03.2009. 20:35 ] @
probaj da koristis referencijalni tip.
integer koji ti imas je value type, i ide na stek (a svaki tred ima svoj stek).
ref tipovi idu na heap koji je zajednicki za sve tredove...
[ mmix @ 01.03.2009. 21:33 ] @
Jok,
to je shared polje, ne ide na stack
[ bobby63 @ 05.03.2009. 12:31 ] @
Radi i:
Code:
Synclock (Me)
Vrednost=2
End Synclock

Mada, iskreno, ne razumem mehanizam, tj ne razumem sta se ovde desava.

Koja je razlika izmedju Volatile i Synclock u ovom slucaju?
Sta je bolje (sigurnije)?