Jeśli mam obiekt C++ utworzony w głównym wątku, a następnie rozpocząć kolejny wątek, i od tego wątku nazywam publiczną funkcję członkowską obiektu utworzonego, co się dzieje?
To zależy od czasu życia obiektu.
Jeśli obiekt zostanie utworzony na stercie (pamięć dynamiczna przy użyciu new
), wówczas drugi wątek będzie prawidłowo uzyskiwał dostęp do elementów obiektu (zakładając, że nie ma warunków wyścigu), chyba że czas życia obiektu zakończył się wywołaniem delete
w pierwszym wątku.
Jeśli obiekt zostanie utworzony na stosie (lokalnie) w pierwszym wątku, będzie można uzyskać niezdefiniowane zachowanie * *, jeśli okres istnienia utworzonego obiektu zakończył się przed uzyskaniem dostępu do drugiego wątku.
Dlaczego można uzyskać dostęp do obiektu na stosie w drugim wątku?
Każdy wątek ma swój własny stos i ile obiekt utworzony na stosie wątku jest ważne i żywe Użytkownik będzie próbował uzyskać dostęp do lokalizacji adresu, który nie wskazuje na jakiekolwiek ważnego obiektu w drugim wątku.
Należy zauważyć, że każdy proces ma przestrzeń adresową, a wszystkie wątki w tym samym procesie współużytkują tę samą przestrzeń adresową, w związku z czym adres zmiennej można uzyskać w drugim wątku. Musisz jednak upewnić się, że adres zawiera prawidłowy obiekt.
Czy jest inaczej, jeśli funkcja publiczna ma parametry lub manipuluje elementami prywatnymi?
Specyfikatory dostępu i wielowątkowość nie są w ogóle powiązane.
We wszystkich wątkach obowiązują te same reguły specyfikacji dostępu.
Czy zachowuje się inaczej w systemie Windows, Linux lub Mac OS?
Odpowiedź na #1
jest gwarantowana we wszystkich systemach operacyjnych.
Jeśli obiekt został utworzony na stercie, czy istnieje prosty sposób usunięcia obiektu po zakończeniu ostatniego wątku? – neckTwi