wielowątkowść - kompilator wycina część kodu

wielowątkowść - kompilator wycina część kodu
mr_jaro
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Grudziądz/Bydgoszcz
  • Postów: 5300
0

Mam niecodzienny problem. Jestem w trakcie pisania bota zarządzającego serwerami. Każdy serwer jest zarządzany w osobnym wątku. Problem pojawia się przy zamykaniu aplikacji, w pętli czekającej na zakończenie działania wątków. Kompilator po prostu wycina pętle czekającą na zamknięcie wątków, przy breakpointach daje mi informacje że ten kod został usunięty przy kompilacji i nigdy się nie wykona.

Kopiuj
	while (true) {
		bool continue_while = false;
		
		for (int k = 0; k < control_list->Count; ++k) {

			if (control_list[k]->boot_thread->ThreadState == System::Threading::ThreadState::Running)
			{
				continue_while = true;
				break;
			}

		}
		
		if (!continue_while) {
			break;
		}
		else {
			Thread::Sleep(100);
		}
	}

Dokładnie wycina pętle while, zostaje tylko for i if w forze który nigdy nie jest prawdą (pomimo, że według debuggera powinien być prawdą w niektórych przypadkach) i w teorii sleep się wykonuje w praktyce po wykonaniu się fora od razu wykonanie przeskakuje poza while.
Tak wiem że jest to ten dziwny twór c++/cli, aplikacja ma swoje początki w 5 lat temu i ja jej nie zaczynałem budować. Rozwój przejąłem 2 lata temu i nie opłaca się tego przepisywać na ten moment.
Pytanie brzmi czy jest sposób by zmusić kompilator by jednak ten kod utworzył? Ewentualnie co tu mam źle bo już mówiąc szczerze zgłupiałem.

Azarien
  • Rejestracja: dni
  • Ostatnio: dni
1

Wywal ten kod. Użyj Join().

https://msdn.microsoft.com/en-us/library/95hbf2ta%28v=vs.110%29.aspx

Coś takiego:

Kopiuj
for (int k = 0; k < control_list->Count; ++k)
    control_list[k]->boot_thread->Join();
mr_jaro
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Grudziądz/Bydgoszcz
  • Postów: 5300
0

Edit ok dzięki działa :)

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.