2013-05-20 12 views
6

Mam aplikację, która musi mieć kod wykonany w bardzo precyzyjnych odstępach czasu. W tym celu potrzebuję również rozdzielczości harmonogramu Windows zwiększonej do 1 ms przez timeBeginPeriod.Czy efekt zatrzymania świat-nośnik .NET zatrzymuje się lub opóźnia wykonanie niezarządzanych wątków i wywołań zwrotnych licznika czasu?

Aby to zrobić, mam natywną bibliotekę C++, która obsługuje wszystkie krytyczne rzeczy za pośrednictwem wywołań zwrotnych, które są wywoływane z TimerQueueTimer w odstępie 1 ms (cały kod natywny).

Sama aplikacja jest aplikacją .NET (C#, więc czysty CLR). Natywna biblioteka dll używa buforowania, więc kod C# sam w sobie nie musi być krytyczny pod względem czasu, o ile ma co najmniej 50 ms czasu wykonania.

Kiedy pojawi się narzędzie do zbierania śmieci, czy to również zatrzyma lub opóźni wykonanie wywołań zwrotnych licznika w moim programie? (Innymi słowy: czy niedeterministyczność programu .NET przenosi się nawet na natywne fragmenty kodu używane przez nią?) Nie znalazłem odpowiedzi na to precyzyjne pytanie. Link do dokumentacji MSDN byłby najbardziej uspokajający.

Używam .NET 4.0

+0

Jaka wersja .NET używasz? GC zmieniło się w 4.5 i może ci pomóc ([MSDN: Fundamentals of Garbage Collection] (http://msdn.microsoft.com/en-us/library/ee787088 (v = vs.110) .aspx)). –

+0

@dialer jakie było twoje doświadczenie? Czy wystąpiły problemy z wydajnością podczas uruchamiania niezarządzanych wątków w zarządzanym środowisku, czy nie? Dzięki :) – BatteryBackupUnit

Odpowiedz

3

moja intuicja nie mówi - CLR wpłynie tylko zarządzanych wątków.

  1. Środowisko CLR nie musi zatrzymywać niezarządzanych wątków w celu zbierania śmieci.
  2. Środowisko CLR nie powinno być świadome wątków innych niż CLR w procesie: naruszałoby to izolację. Pomyśl o serwerze IIS lub serwerze SQL - oba hostują CLR, ale nie wyobrażam sobie, by CLR zamrażał wszystkie wątki w procesie ... Nawet jeśli funkcje API WIN32 są używane przez zarządzany kod użytkownika (stored-proc/aplikacja internetowa) do próbowania manipulowania niezarządzanymi wątkami w procesie, hostowany kod hostowany nie powinien nawet mieć uprawnień zabezpieczeń wymaganych do manipulowania wątkami nie-CLR hosta (do systemu Windows CLR jest "kolejnym obiektem COM") .

nie mogę znaleźć potwierdzenia MSDN, ale można próbować udowodnić, że niekontrolowana wątek jest uruchomiony podczas zbierania śmieci: mieć niekontrolowana wątek stale śledzenia i mają GC notification mechanism śledzenie. Sprawdź, czy śledzenie wątku zarządzanego jest kontynuowane podczas procesu czyszczenia pamięci.

(także uwagę zasługuje to, że istnieje kilka GC "modes", które zachowują się inaczej)

+0

Myślę, że to jest poprawne (mam nadzieję, że tak), ponieważ dokumentacja [link] (http://msdn.microsoft.com/en-us/library/ee787088%28v=vs.110%29.aspx) w komentarzu AndyBrown mówi, że "wątki z natywnym kodem nie mają wpływu". Jednak moje wywołania zwrotne licznika czasu działają w wątku puli wątków, a ten wątek nie jest jeszcze wybrany między dowolnymi 2 wywołaniami zwrotnymi. I nie jestem pewien, czy wszystkie zawieszone wątki puli wątków mogą zostać * wznowione * podczas operacji GC (biorąc pod uwagę, że istnieją również zarządzane wątki puli wątków?) – dialer