Sdílet prostřednictvím


Multithreading: Programové tipy

Při přístupu k datům vžadují vícevláknové aplikace přísnější zacházení než jedno vláknové aplikace. Protože existuje více nezávislých cest v realizaci současného používání ve vícevláknových aplikacích, musí algoritmy, data nebo obojí vědět, zda mohou být data použita více než jedním vláknem současně. Toto téma popisuje techniky pro předcházení potenciálních problémů při programování vicevláknových aplikací s knihovnou Microsoft Foundation Class (knihovna MFC).

  • Přístup k objektům z více vláken

  • Přístup k objektům knihovny MFC z Non-MFC vláken

  • Mapování zpracování systému Windows

  • Komunikace mezi vlákny

Přístup k objektům z více vláken

Z velikostních a výkonnostích důvodů, nejsou objekty knihovny MFC vláknově bezpečné na úrovni objektu, ale pouze na úrovni třídy. To znamená, že můžete mít dvě oddělená vlákna, která zpracovávají dva různé objekty CString, ale nemůžete mít dvě vlákna, která manipulují se stejným objektem CString. Pokud musíte mít nezbytně více vláken, manipulujících stejným objektem, chraňte přístup vhodnými Win32 synchronizačními mechanismy, jako jsou například kritické sekce. Další informace o kritických sekcích a jiných souvisejících objektech, naleznete v tématu Synchronizace ve Windows SDK.

Knihovna tříd používá interně kritickou sekci k ochraně globálních datových struktur, které jsou například použity při přidělení ladící paměti.

Přístup k objektům knihovny MFC z Non-MFC vláken

Pokud máte vícevláknovou aplikaci, která vytváří vlákno jiným způsobem než použitím objektu CWinThread, nemůžete z tohoto vlákna přistupovat k jiným objektům knihovny MFC. Jinak řečeno, pokud chcete přistupovat do libovolného objektu knihovny MFC z jiného vlákna, musíte vytvořit toto vlákno jednou z metod, popsaných v Multithreading: Vytváření vláken uživatelského rozhraní nebo Multithreading: Vytváření pracovních vláken. Tyto metody jsou jediné, kterým povoluje knihovna tříd inicializovat vnitřní proměnné, které jsou nutné ke zpracování vícevláknových aplikací.

Mapování zpracování systému Windows

Z obecného pravidla platí, že může být přístupné vlákno pouze těm objektům knihovny MFC, které toto vlákno vytvořily. Důvodem je to, že dočasná nebo trvalá mapování zpracování systému Windows jsou uloženy v místním úložném prostoru vlákna, pro zachování ochrany před současným přístupem z více vláken. Například pracovní vlákno nemůže provádět výpočet a poté zavolat členskou funkci UpdateAllViews dokumentu, pro získání okna, obsahujícího zobrazení nových upravených dat. To nemá žádný účinek, protože mapa z objektů CWnd na HWND je umístěna na primární vlákno. To znamená, že jedno vlákno může obsahovat mapování ze zpracování systému Windows na objekt jazyka C++, ale jiné vlákno může mapovat stejné zpracování na jiný objekt jazyka C++. Změny provedené v jednom vlákně se nemusí projevit v jiném vlákně.

Tento problém lze vyřešit několika způsoby. Prvním je předat jednotlivá zpracování (například HWND) do pracovího vlákna než objektům jazyka C++. Pracovní vlákno poté přidá tyto objekty do jeho dočasné mapy voláním příslušné členské funkce FromHandle. Můžete také přidat objekt do dočasné mapy vlákna, zavoláním Attach, ale to by mělo být provedeno pouze v případě, že je zaručeno, že objekt bude existovat déle než vlákno.

Jiný způsob je vytvořit nové uživatelsky definované zpravy, odpovídající různým úlohám. Vaše pracovní vlákna budou provádět a odesílat tyto zprávy hlavnímu oknu aplikaci, pomocí**:: PostMessage**. Tento způsob komunikace je podobný konverzaci mezi dvěmi různými aplikacemi s tím rozdílem, že jsou obě vlákna spuštěna ve stejném adresním prostoru.

Další informace o mapování zpracování naleznete v tématu Technické poznámky 3. Další informace o vlákně místního úložiště naleznete v tématech Místní úložný prostor vlákna a Použití místního úložného prostoru vlákna v Windows SDK.

Komunikace mezi vlákny

Knihovna MFC poskytuje několik tříd, které povolují vláknům synchronizovat přístup k objektům pro zachování vláknové bezpečnosti. Použití těchto tříd je popsáno v tématech Multithreading: Jak používat synchronizační třídy a Multithreading: Kdy použít synchronizační třídy. Další informace o těchto objektech naleznete v tématu Synchronizace ve Windows SDK.

Viz také

Koncepty

Multithreading s C++ a knihovnou MFC