Wielowątkowość: Porady dotyczące programowania
Aplikacje wielowątkowe wymagają opieki bardziej rygorystyczne niż aplikacji jednowątkowych podczas uzyskiwania dostępu do danych.Ponieważ istnieje wiele, niezależnych ścieżek wykonania w jednocześnie korzystać w aplikacjach wielowątkowych algorytmów, danych lub oba muszą być świadomi danych mogą być 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 klasy (MFC).
Uzyskiwanie dostępu do obiektów z wielu wątków
Uzyskiwanie dostępu do obiektów MFC z wątków nie MFC
Mapy dojście systemu Windows
Komunikacja między wątki
Uzyskiwanie dostępu do obiektów z wielu wątków
Rozmiar i wydajność MFC obiekty nie są wielowątkowość 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 bezwzględnie musi mieć wiele wątków manipulowania tym samym obiekcie, chronić dostęp z odpowiednich mechanizmów synchronizacji Win32, takie jak sekcje krytyczne.Aby uzyskać więcej informacji o sekcje krytyczne i inne powiązane obiekty, synchronizacji w Windows SDK.
Biblioteka klas wewnętrznie sekcje krytyczne ochrony struktur danych globalnych, takich jak używane przez program debug alokacji pamięci.
Uzyskiwanie dostępu do obiektów MFC z wątków nie MFC
Jeśli masz wielowątkowych aplikacji, która tworzy wątek w sposób inny niż przy użyciu CWinThread obiektu i inne obiekty MFC nie może uzyskać dostępu z tego wątku.Innymi słowy, jeśli mają dostęp do dowolnego obiektu MFC z wątek pomocniczy, należy utworzyć wątek jedną z metod opisanych w Multithreading: Tworzenie wątków interfejsu użytkownika lub Multithreading: Tworzenie wątków roboczych.Metody te są tylko te, które pozwalają Biblioteka klas inicjowanie 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.Wynika to z mapy uchwyt czasowych i Windows są przechowywane w lokalnego magazynu wątków dla utrzymania ochrony przed równoczesnym dostępem z wielu wątków.Na przykład wątek roboczy nie może wykonywać obliczenia, a następnie wywołać dokument UpdateAllViews Członkowskich funkcji systemu Windows, które zawierają widoki na nowe dane zmodyfikowane.To nie ma wpływu na wszystkich, ponieważ mapy z CWnd obiekty do HWNDs jest lokalne dla wątku głównego.Oznacza to, że jeden wątek może mieć mapowania dojścia systemu Windows do obiektów C++, ale inny wątek może mapować tego samego uchwytu do różnych obiektów C++.Zmiany wprowadzone w jednym wątku nie zostanie odzwierciedlony w innych.
Istnieje kilka sposobów obejścia tego problemu.Pierwszym jest przekazanie poszczególnych uchwyty (takie jak HWND) zamiast obiektów C++ do wątku roboczego.Wątek roboczy następnie dodaje te obiekty do jej tymczasowego mapy wywołując odpowiednie FromHandle funkcji składowej.Obiekt można również dodać do mapy stałe dla wątku, wywołując Attach, należy to zrobić tylko wtedy, gdy są gwarantowane, że obiekt będzie istniał dłużej niż wątek, ale.
Inną metodą jest utworzenie nowych wiadomości zdefiniowane przez użytkownika, odpowiadającego różnych zadań użytkownika 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 podobne do dwóch różnych aplikacji konwersacji, chyba że obie te wątki w tej samej przestrzeni adresowej.
Aby uzyskać więcej informacji na temat map uchwyt, zobacz technicznej Uwaga 3.Aby uzyskać więcej informacji na temat lokalnego magazynu wątków, zobacz Lokalnego magazynu wątków i Przy użyciu lokalnego magazynu wątków w Windows SDK.
Komunikacja między wątki
MFC zawiera szereg klas, które wątki do synchronizowania dostępu do obiektów, aby zachować bezpieczeństwo wątków.Opisano sposób użycia tych klas w Multithreading: jak używać klasy synchronizacji i Multithreading: kiedy należy używać klasy synchronizacji.Aby uzyskać więcej informacji na temat tych obiektów, zobacz synchronizacji w Windows SDK.