Dobra. Pisałeś kiedyś program, który współdzielił jakiś obszar pamięci z innym programem, lub prościej że w jednym programie dwa wątki mogły korzystać z tego samego obszaru pamięci w tym samym czasie i mogły jednocześnie zapisywać i odczytywać? Jeśli nie to przedstawie ci przykładowy problem na bazie danych np. w mysql bo to najprostszy przypadek wg mnie.
Wyobraź sobie, że cała operacja (dowolna) składa się z kilku zapytań i wszystkie te zapytania są konieczne aby baza miała sens. Np. ktoś coś kupił to kilkoma zapytaniami zmniejszamy zawartość stanu magazynowego itp. Co jeśli podczas wykonywania tych kilku zapytań ktoś inny zapyta o tą samą tabelę lub niedajboże również zacznie ją modyfikować? Jest to możliwe. Jeden lub drugi (albo oba) zbiór zapytań może zostać źle wykonany, bo drugie zacząły się wykonywać w połowie pierwszego, a to oznacza że jeszcze nie wszystkie tabele są spójne i uaktualnione. Drugie zapytanie więc nie ma aktualnych tabel. W takim przypadku wystąpią błędy. Dlatego w mysql są mechanizmy które pozwalają by jakiś zbiór zapytań zablokował innym zapytaniom dostęp do tabel na jakiś czas i tamte zapytania będą czekać.
Rozumiesz w czym problem?
Teraz wyobraź sobie dwa wątki. Jeden chce mi zmodyfikować rozmiar pierwszego okna a drugi drugiego. I uruchamiają się prawie w tym samym momencie (prawie). Pierwszy ustawia sobie okno aktywne na to co go interesuje, a drugi zrobi to samo zaraz za nim. Ponieważ wg mojego zrozumienia teorii jest to maszyna stanów mająca jedno okno aktywne w danym momencie to to oznacza że drugi wątek zmienił mi to okno na swoje. W takim przypadku pierwszy wątek wykona operacje na nieswoim oknie bo maszyna stanów ma inne dane niż on wpisał na początku. Czy tak jest? Czy trzeba się przed tym zabezpieczyć pisząc programy wielowątkowe? Czy muszę jakoś ręcznie opracować mechanizm zabezpieczania przed takimi sytuacjami?
Jeśli jeszcze nie rozumie mnie nikt to przedstawiam 'tabelkę'. Po lewej to jest stan wykonywania się pierwszego wątku, po drugiej drugiego.
glutSetWindow(1)
......jakieś instrukcje. Procesor
zaczyna wykonywać operacje
drugiego wątku
glutSetWindow(2)
.................
...procesor przerzuca
sie na wątek pierwszy
zmieniam rozmiar okna
itd itd.
Jaki będzie wynik tej operacji? Czy wątek pierwszy zmodyfikował mi pierwsze okno czy drugie? Chciał pierwsze, ale zanim to zrobił drugi wątek zmienił mu okno i wykonał swoje operacje.