Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.

Win32 Mutexi

[es] :: C/C++ programiranje :: Win32 Mutexi

[ Pregleda: 2767 | Odgovora: 7 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

Riste Pejov
Team Leader/Senior Software Developer @
Ein-Sof ltd Skopje
Skopje, Macedonia

Član broj: 128
Poruke: 571
62.162.102.*

Jabber: richie@bagra.net.mk
ICQ: 154236769
Sajt: riste.softver.org.mk


Profil

icon Win32 Mutexi12.02.2003. u 09:20 - pre 258 meseci
Code:

// Make the code thread safe
//----------------------------------------
HANDLE hIOMutex= CreateMutex (NULL, FALSE, NULL);
WaitForSingleObject( hIOMutex, INFINITE );
//----------------------------------------

TASession *my_ses;
for(int is=0;is<sessions->Count;is++)
   {
   my_ses=(TASession*)sessions->Items[is];
   if(my_ses->socket_handle==Socket->SocketHandle)
      {
      conn_id=my_ses->session_id;
      conn=is;
      break;
      }else conn=-1;

   }
if(conn!=-1)
   {
   delete my_ses;
   sessions->Delete(conn);
   }
else
   Terminate();

// end of thread safe code
ReleaseMutex( hIOMutex);

Imam ovakav kod, u kojeg imam vise thredova koji upisuju neke podatke u jedne liste,
e sad poenta je da ne dodje do kolizije izmegju thredovima pre brisanje iz liste thread ceka jednog mutexa.

Nije mi jasno, koja je prednost ili mana koriscenjem imena kod mutexima ?
Najverojavatnije da se moze koristiti isti mutex za dva razlicna podrucja u kodu ?
Dali ako nisam kreirao mutex sa imenom, WaitForSingleObject zna kojeg mutexa treba da ceka ?
ili kako da uradi dva razlicna dela u kodu da zakljucam istim mutexom (Valjda sa mutexom sa specificnog imena)?

Pozdrav
People who think they know everything tend to irritate those of us who do.
 
Odgovor na temu

Dragi Tata
Malo ispod Kanade

Član broj: 1958
Poruke: 3906
199.171.112.*



+6 Profil

icon Re: Win32 Mutexi12.02.2003. u 16:13 - pre 258 meseci
1. Pre svega, na osnovu koda koji si prikazao, čini mi se da si napravio jednu grešku: ako svaka nit (thread) kreira svoj mutex, onda nemaš nikakvu sinhronizaciju, jer će svaka nit da čeka na drugi mutex. Treba da u "glavnoj" niti kreiraš jedan mutex i da ga proslediš svim nitima koje hoćeš da sinhronizuješ.

2. Mutex-i sa imenima, kao i svi imenovani kernel objekti, služe za sinhronizaciju procesa. Znači, ako u jednom procesu kreiraš mutex sa nekim imenom, u drugom procesu možeš da dobiješ handle na taj isti mutex ako mu znaš ime.

3. Ova linija koda
Code:

WaitForSingleObject( hIOMutex, INFINITE );


se smatra lošom programerskom praksom i može da dovede do deadlock-a. U principu se koristi nešto kao:

Code:

    dwWaitResult = WaitForSingleObject( 
        hMutex,   // handle to mutex
        5000L);   // five-second time-out interval
 
    switch (dwWaitResult) 
    {
        // The thread got mutex ownership.
        case WAIT_OBJECT_0: 
       // OK. dobio si pristup 
            break; 
        } 

        // Cannot get mutex ownership due to time-out.
        case WAIT_TIMEOUT:
         // vreme je isteklo. Možeš ponovo da čekaš ili da prijaviš time-out
            return FALSE; 

        // Got ownership of the abandoned mutex object.
        case WAIT_ABANDONED: 
            return FALSE; 
    }


4. Savetujem ti da ne koristiš direktno WinAPI za sinhronizaciju, već da koristiš klase za rad sa time - mogu jako da ti olakšaju život. Primer:
http://www.codeproject.com/threads/tsynchro.asp

5. Ima li potrebe da koristiš mutex? Critical Sections je često bolje rešenje.

Pozdrav.

 
Odgovor na temu

Riste Pejov
Team Leader/Senior Software Developer @
Ein-Sof ltd Skopje
Skopje, Macedonia

Član broj: 128
Poruke: 571
212.110.78.*

Jabber: richie@bagra.net.mk
ICQ: 154236769
Sajt: riste.softver.org.mk


Profil

icon Re: Win32 Mutexi13.02.2003. u 00:40 - pre 258 meseci
Znaci sam bio u pravu kad sam rekao da mora to biti imenovan Mutex, i u mome slucaju nema sanse doci do deadlocka jer imam samo jedan mutex.

Samo jos nesto mi nije jasno, sa ReleaseMutex obrisem mutex iz memorije, sa CreateMutex, ga kreiram, a kako da ga jednostavno zakljucim, uradim neki kod pa da ga onda da otkljucim i ostavim da ga drugi tredovi zakljuce ?

Hvala puno tata.
People who think they know everything tend to irritate those of us who do.
 
Odgovor na temu

Dragi Tata
Malo ispod Kanade

Član broj: 1958
Poruke: 3906
..ndg-pm4-1.dialup.nethere.net



+6 Profil

icon Re: Win32 Mutexi13.02.2003. u 02:49 - pre 258 meseci
Hmm, pa ne znam zašto si došao do zaključka da tvoj mutex mora da bude imenovan. Da li pokušavaš da sinhronizuješ procese? Koliko razumem radiš sa nitima (threads) a za to ti je dobar anonimni mutex.

Što se drugog pitanja tiče, evo kako stoje stvari:

1. Kreiraš (anonimni) mutex samo u "glavnoj" niti sa CreateMutex i handle koji dobiješ proslediš svim nitima koje želiš da sinhronizuješ.

2. Svaka nit čeka na WaitForSingleObject. Kad je povratna vrednost iz te funkcije WAIT_OBJECT_0, to znači da je nit dobila "vlasništvo" nad mutex-om i ni jedna druga nit koja čeka na WaitForSingleObject ne može da nastavi dalje.

3. Kad završiš sa "kritičnim" delom koda, pozoveš ReleaseMutex. Ova funkcija ne briše mutex iz memorije, već se njenim pozivom odričeš vlasništva nad mutex-om i sledeća nit koja čeka na WaitForSingleObject može da dobije vlasništvo nad njim.

4. Kad sve niti završe rad, počistiš mutex sa CloseHandle.

Pseudo kod za korišćenje mutex-a bi izgledao ovako nekako:

Code:

int main()
{
HANDLE hMutex = CreateMutex(...);

HANDLE niti[brojNiti];
for (i = 0; i < brojNiti; ++i)
  niti [i] = _beginthreadex(...NitFunkcija,.. &hMutex); // startovanje niti;

WaitForMultipleObjects (...niti...); //cekas da se sve niti zavrse

CloseHandle(hMutex); //ovo i nije neophodno ako izlazis iz procesa
}

DWORD NitFunkcija(void* hMutex)
{
while (uslov_za_kraj)
{
WaitForSingleObject(..hMutex...);
//Odavde pa nadalje, kod je "zakljucan"
...
ReleaseMutex(...hMutex...); //oslobodi mutex - od sad pa nadalje kod nije zakljucan
}
}
}


I još jednom ti ponavljam: bolje koristi gotove klase i to za Critical Sections, a ne mutex
 
Odgovor na temu

Riste Pejov
Team Leader/Senior Software Developer @
Ein-Sof ltd Skopje
Skopje, Macedonia

Član broj: 128
Poruke: 571
62.162.102.*

Jabber: richie@bagra.net.mk
ICQ: 154236769
Sajt: riste.softver.org.mk


Profil

icon Re: Win32 Mutexi13.02.2003. u 12:12 - pre 258 meseci
sad je sve jasno kao suza :)

Inace radim u BCB6 i nisam hteo da koristim VCL klase za kriticne sekcije radi to sto kod kojeg zelim da sinhronizujem se nalazi u niti socketa.
People who think they know everything tend to irritate those of us who do.
 
Odgovor na temu

Rapaic Rajko
Bgd

Član broj: 4105
Poruke: 810
*.pexim.co.yu



+62 Profil

icon Re: Win32 Mutexi14.02.2003. u 10:17 - pre 258 meseci
Postoji jedan jak argument protiv CriticalSection-a: Linux.
U Linuxu ne postoji CS, ali postoji Mutex...
Pozdrav

Rajko

P.S. Da budem iskren, ovo je tvrdnja jednog mog poznanika. Nisam Linux-ovac (jos uvek), pa ne mogu 100% da tvrdim da je tacna. Ako gresim, neka me neko ispravi.
 
Odgovor na temu

Dragi Tata
Malo ispod Kanade

Član broj: 1958
Poruke: 3906
199.171.112.*



+6 Profil

icon Re: Win32 Mutexi14.02.2003. u 16:02 - pre 258 meseci
Tačno je da u Linux-u ne postoji CS, ali ovde govorimo o Win32 programima koji ne mogu da budu portabilni koristili mi CS ili mutex. Ko želi da pravi portabilan višenitni kod, treba da koristi na primer Boost.Threads biblioteku, a ne funkcije kao što su WaitForSingleObject. Koliko sam razumeo, Riste pravi samo Windows verziju i ne zanima ga portabilnost.

Uopšte, čak i sa takvim bibliotekama, treba biti veoma oprezan ako se računa na portabilnost. Razni operatvni sistemi interno implementiraju niti na različite načine i može se desiti da isti kod na različitim operativnim sistemima dovede do različitih efekata.
 
Odgovor na temu

Rapaic Rajko
Bgd

Član broj: 4105
Poruke: 810
*.beg.sezampro.yu



+62 Profil

icon Re: Win32 Mutexi16.02.2003. u 19:46 - pre 257 meseci
Znaci, moj prijatelj me nije slagao za CS. Ukoliko neko zeli da uci Linux programiranje, dajem link ka obilju koda koji je svima na dohvat ruke: VCL Delphi 6(7) ili BCB 6...
Tu ima uslovnog programiranja koliko vam volja: malo Win, malo Linux...
Izvinjavam se na digresiji.
Pozdrav

Rajko
 
Odgovor na temu

[es] :: C/C++ programiranje :: Win32 Mutexi

[ Pregleda: 2767 | Odgovora: 7 ] > FB > Twit

Postavi temu Odgovori

Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.