Wielowątkowość: porady dotyczące programowania
Podczas uzyskiwania dostępu do danych, aplikacji wielowątkowych wymagają opieki bardziej rygorystyczne niż aplikacji jednowątkowych.Ponieważ istnieje wiele, niezależnych ścieżek wykonania w jednocześnie korzystać w aplikacjach wielowątkowych, algorytmy, dane lub oba muszą być świadomi tych danych można używane przez więcej niż jeden wątek na raz.W tym temacie wyjaśniono technik dla uniknięcia potencjalnych problemów podczas programowania aplikacji wielowątkowych z biblioteki Microsoft Foundation Class (MFC).
Uzyskiwanie dostępu do obiektów z wielu wątków
Uzyskiwanie dostępu do obiektów MFC z wątków biblioteki MFC
Mapy dojście systemu Windows
Komunikacja między wątków
Uzyskiwanie dostępu do obiektów z wielu wątków
Ze względów rozmiaru i wydajności MFC obiekty nie są wątków na poziomie obiektu, tylko na poziomie klasy.Oznacza to, że można mieć dwa osobne wątki manipulowania dwóch różnych CString obiektów, ale nie dwa wątki manipulowania taki sam CString obiektu.Jeśli absolutnie musi mieć wiele wątków manipulowania tym samym obiekcie, chronić takiego dostępu z odpowiednich mechanizmów synchronizacji systemu Win32, takie jak sekcji krytycznych.Aby uzyskać więcej informacji na temat sekcji krytycznych i inne powiązane obiekty, zobacz synchronizacji w Windows SDK.
Biblioteka klas używa sekcji krytycznych wewnętrznie do ochrony struktur danych globalnych, takich jak te stosowane przez program debug alokacji pamięci.
Uzyskiwanie dostępu do obiektów MFC z wątków biblioteki MFC
Jeśli masz aplikacji wielowątkowych, który tworzy wątek w sposób inny niż przy pomocy CWinThread obiektu, nie można uzyskać dostępu inne obiekty MFC z tego wątku.Innymi słowy, jeśli mają dostęp do dowolnego obiektu usługi MFC z wtórnego wątku, należy utworzyć wątek z jednej z metod opisanych w wielowątkowość: Tworzenie wątków interfejsu użytkownika lub wielowątkowość: Tworzenie wątków roboczych.Te metody są tylko te, które pozwalają Biblioteka klas zainicjować zmiennych wewnętrznych, niezbędnych do obsługi aplikacji wielowątkowych.
Mapy dojście systemu Windows
Jako zasadę ogólną Wątek można uzyskać dostęp tylko obiekty MFC utworzonych przez siebie.Dlatego tymczasowe lub stałe mapy dojście systemu Windows są przechowywane w pamięci lokalnej wątku w celu utrzymania ochrony przed równoczesnym dostępem z wielu wątków.Na przykład, wątek roboczy nie może wykonać obliczenia, a następnie wywołać dokumentu UpdateAllViews funkcji składowej, aby system windows, które zawierają widoki na nowe dane, modyfikować.Nie ma to wpływu na wszystkich, ponieważ mapa z CWnd obiekty do HWNDs jest lokalnym wątkiem głównym.Oznacza to, że jeden wątek może mieć mapowanie dojście systemu Windows do obiektu języka C++, ale inny wątek mogą być mapowane tej samej obsługi do innego obiektu języka C++.Zmiany wprowadzone w jednym wątku nie będzie odzwierciedlane w innych.
Istnieje kilka sposobów wokół tego problemu.Pierwszym jest przekazać dojścia indywidualnych (takie jak HWND) a nie obiektami C++ do wątku roboczego.Wątek roboczy następnie dodaje te obiekty do jego tymczasowe mapę poprzez wywołanie odpowiedniej FromHandle funkcji składowej.Obiekt można dodać do mapy stałe dla wątku, wywołując Attach, ale należy to zrobić tylko wtedy, gdy są gwarantowane, że obiekt będzie istniał dłużej niż wątku.
Inną metodą jest utworzenie nowych wiadomości przez użytkownika odpowiadający różnych zadań z wątków roboczych będzie wykonywania i zaksięgować te wiadomości do głównego okna aplikacji za pomocą :: PostMessage.Ta metoda komunikacji jest podobny do dwóch różnych aplikacji, rozmawiając z tym, że zarówno wątki są wykonywane w tej samej przestrzeni adresowej.
Aby uzyskać więcej informacji na temat map uchwyt, zobacz techniczne Uwaga 3.Aby uzyskać więcej informacji dotyczących lokalnego magazynu wątków, zobacz Lokalnego magazynu wątków i Za pomocą lokalnego magazynu wątków w Windows SDK.
Komunikacja między wątków
MFC zawiera szereg klas, które wątki zsynchronizować dostęp do obiektów, aby zachować bezpieczeństwo wątków.Korzystanie z tych klas jest opisany w wielowątkowość: jak używać klasy synchronizacji i wielowątkowość: kiedy należy używać klasy synchronizacji.Aby uzyskać więcej informacji na temat tych obiektów, zobacz synchronizacji w Windows SDK.