[C++/WinAPI] Jeden obiekt sekcji krytycznej na każdy wątek ?

0

Witam.

Mam dwie klasy wątków (tworzą nowy wątek, i wykonują kod wątku).

Te dwie klasy wątków korzystają z jeden zmiennej globalnej, i dlatego potrzebuję zrobić synchronizację wątków.

Pytanie takie:

  • Czy w każdej klasie wątku powinienem utworzyć nowy obiekt sekcji krytycznej ?
    tj. "CRITICAL_SECTION cs" ? czy może jeden obiekt sekcji krytycznej na każdą klasę wątku ? np. utworzyć klasę sekcji krytycznej i niech każdy wątek po niej dziedziczy.

Dzięki.
Pozdrawiam.

0

Jeżeli x wątków chce korzystać z jednej zmiennej, wystarczy jedna sekcja dla wszystkich wątków.

0

a wrecz mowiac: musi byc jedna i ta sama sekcja, jesli kilka watkow ma sie wzajemnie zsynchronizowac

0
// Główne okno aplikacji
class MainDialog
{
	CListBox m_listbox;
	
        // w tej klasie będę uruchamiał wątki
	Watek1* m_watek1; 
	Watek2* m_watek2;
	
public:	
	// konstruktory etc.
};
// Wątek 1
class Watek1
{
// konstruktory etc.
public:
	DWORD Wykonaj() { m_listbox->DodajElement(); // kod wykonywany w watku}
};
// Wątek 2
class Watek2
{
// konstruktory etc.
public:
	DWORD Wykonaj() { m_listbox->DodajElement(); // kod wykonywany w watku}
};

I teraz tak, do każdego wątku przekazuję wskaźnik na obiekt kontrolki m_listbox,
(kontrolka ta znajduje sie w głównym oknie aplikacji - klasa MainDialog),
i każdy wątek wpisuje pewne dane do tej kontrolki.

Czy w takim przypadku muszę w ogóle korzystać z synchronizacji wątków ? jeśli tak,
to dla tych dwóch wątków muszę utworzyć jeden obiekt "CRITICAL_SECTION" tak ?

Nie jestem jeszcze pewny, ale wątek chyba będzie uruchomiony tylko raz.

Dzięki.

0

Czy w takim przypadku muszę w ogóle korzystać z synchronizacji wątków ?

W dokumentacji znalazłem coś takiego:

For size and performance reasons, MFC objects are not thread-safe at the object level, only at the class level. This means that you can have two separate threads manipulating two different CString objects, but not two threads manipulating the same CString object. [...] If you have a multithreaded application that creates a thread in a way other than using a CWinThread object, you cannot access other MFC objects from that thread. In other words, if you want to access any MFC object from a secondary thread, you must create that thread with one of the methods described in Multithreading: Creating User-Interface Threads or Multithreading: Creating Worker Threads. [...] As a general rule, a thread can access only MFC objects that it created. This is because temporary and permanent Windows handle maps are kept in thread local storage to help maintain protection from simultaneous access from multiple threads

jeśli tak, to dla tych dwóch wątków muszę utworzyć jeden obiekt "CRITICAL_SECTION" tak ?

Tak. BTW w MFC masz klasę CCriticalSection.

0
Jacek XXL napisał(a)
// Główne okno aplikacji
class MainDialog
{
	CListBox m_listbox;
	
        // w tej klasie będę uruchamiał wątki
	Watek1* m_watek1; 
	Watek2* m_watek2;
	
public:	
	// konstruktory etc.
};
// Wątek 1
class Watek1
{
// konstruktory etc.
public:
	DWORD Wykonaj() { m_listbox->DodajElement(); // kod wykonywany w watku}
};
// Wątek 2
class Watek2
{
// konstruktory etc.
public:
	DWORD Wykonaj() { m_listbox->DodajElement(); // kod wykonywany w watku}
};

I teraz tak, do każdego wątku przekazuję wskaźnik na obiekt kontrolki m_listbox,
(kontrolka ta znajduje sie w głównym oknie aplikacji - klasa MainDialog),
i każdy wątek wpisuje pewne dane do tej kontrolki.

Czy w takim przypadku muszę w ogóle korzystać z synchronizacji wątków ? jeśli tak,
to dla tych dwóch wątków muszę utworzyć jeden obiekt "CRITICAL_SECTION" tak ?

Nie jestem jeszcze pewny, ale wątek chyba będzie uruchomiony tylko raz.

Dzięki.

Podejrzewam ze to nie zagada. Odwolywanie sie do obiektow wizualnych bezposrednio z watku moze byc ciezkie no zsynchronizowania (no chyba ze globalna sekcja krytyczna dla watkow ale smierdzi mi takie cos lamerstwom ;) ). Najlepiej operacje takie wykonywac z kolejki komunikatow, tzn. watek wysyla komunikat do systemowej kolejki ktory to komunikat z kolei wykonuje operacje na obiekcie wizualnym.

0

Może być jeden ,może być kilka.
Stare posty też są aktualne.

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