[C WinApi]Wątki ,dostęp do jednej zmiennej.

0

Czy w przypadku jednej zmiennej wykorzystywanej przez
dwa wątki wymagana jest specjalna ochrona dostępu do
jej zawartości ?

Założenia :
1.Dwa wątki główny i dodatkowy
2.Oba posiadją jednakowy priorytet wykonania.
3.Wątek główny ma za zadanie zamknięcie wątku dodatkowego poprzez "wspólną zminna globalną".
4.Sytuacja jest nieco uproszczona ,wątek główny może uruchomić wątek dodatkowy po jego
zakończeniu ,przed ponownym utworzeniem wątku ma wyłączny dostęp do zmiennej tak że można
to pominąc .[czyli głównie chodzi o zamknięcie wątku dodatkowego ]

Przyklad pseudo kod:

bool zmienna = true ; // globalna np.

void wątek_dodatkowy()
{
      while(zmienna)
     {
          działa,,,
     }
}

..... 
..... 
      // wątek główny 
          zmienna = false // kończymy wątek dodatkowy
.....
...... 

Pytanie :
O ile przy ochronie kilku zmiennych których stan jest krytyczny
sytuacja jest jasna bo wiadomo że należy zablokować dostęp
innego wątku aby nie modyfikował zmiennych których wartość musi
być kontrolowana dokładnie przez jeden wątek jeśli dostęp zostanie
uzyskany do jednej zmiennej powiązanej logicznie z innymi.

W przypadku jednej zminnej zakładając że kolejność odczytania
jej wartości przez wątki nie jest krytyczna czy istnieje potrzeba
jej ochrony np. użycia specjalnych fun api używanych np.
w tzw. blokadzie wirowej aby uniknąć zakleszczenia Aplikacji ?
Czy taką zmienną należy zmieniać w sposób "atomowy" czy można
sobie dać z tym spokój,,,,

Event. czy przeniesienie kodu bez ochrony zmiennej na maszynę
wieloprocesorową nie spowoduje załamania aplikacji bez
stosowania ochrony dostępu ?

Jako że system traktuje wątki i procesy w sposób "wirtualny" mam
wątpliwości czy proba dostępu do jednej zmiennej w jednym
procesie ale przez dwa wątki wymaga specjalnego traktowania
czy można przyjąć że wszystko dzieje się szeregowo i nie nastąpi
żaden konflikt ,,,

0

jeśli do zmiennej zapisuje tylko 1 wątek, a drugi używa jej tylko do odczytu, nie ma potrzeby zabezpieczać, co innego jeśli chodzi o większe elementy...
W kodzie, który podałeś nie ma potrzeby zabezpiecznia

0

Yhy...
Tak to napisłem (minimum operacji ) że wątek dodatkowy sprawdza tylko stan zmiennej ,
zapisuje jedynie wątek główny .
(przynajmniej tak mi się wydaje [green] )
Czyli nie powinno byc konfliktu w dostępie ,,?
Przyjąć opcję jeśli nie ma konkurencji do zapisu można nie stosować ochrony ?
//Edit
No dobra nie będę upierdliwy , przyjmuję,,
dzięki crayze

0

dla pojedynczej zmiennej "konfliktów" nie będzie, co innego jeśli są tablice itp.

0

A jednak będę męczący , a tablice ? , przecież to wskaźnik ?
Co za różnica ?
//Edit
A nie już wiem chodzi o i ilość zmiennych "częśc" bez ochrony całości , może być zmodyfikowana
przez inny wątek .

dzięki ...
pozdro dzejo .

0
volatile bool zmienna = true ;
0

to wiem , ;-)

0
crayze napisał(a)

jeśli do zmiennej zapisuje tylko 1 wątek, a drugi używa jej tylko do odczytu, nie ma potrzeby zabezpieczać..

Jesli jeden odczytuje a drugi zapisuje to niestety obawiam sie ze jest potrzeba zabezpieczenia, gdyby oba odczytywaly wtedy nie byloby takiej potrzeby.
Inna sprawa, do kontroli uzywac eventow, semaforow, czegokolwiek tylko nie 'zmiennych globalnych'!!!!

0

No tak jak zwykle Pan Egonek sceptycznie podchodzi do tematu ,,,
Może się Facet trochę uśmiechnij do życia ,,,
Czyli jak to k..a rozwiązać , zabezpieczać na wszelki wypadek czy nie
, nie wiem jak to jest zrobione na niskim poziomie , gdybym wiedział nie było by problemu
, czy ktoś posiada jakąś wiedzę w tym temacie ,,,,

Eus deus kosmateus wzywam cię ,,,,

0
// bool zmienna = true ; // globalna np.

HANDLE hTerminated = CreateEvent(0,true,false,"");


void wątek_dodatkowy()
{
      // while(zmienna)
      while(WAIT_TIMEOUT == WaitForSingleObject(hTerminated,0));
     {
          działa,,,
     }
}

..... 
..... 
      // wątek główny 

      //    zmienna = false // kończymy wątek dodatkowy
      SetEvent(hTerminated);
.....
...... 

I ucz sie bo ja wiecznie zyl nie bede :P

1 użytkowników online, w tym zalogowanych: 0, gości: 1