Piszę pewien program pracujący w kilku wątkach. Są pewne dwie procedury, z pewnych względów nie można dopuścić do równoczesnego wykonywania się obu procedur, ponieważ operują one na zmiennych globalnych, każda zawiera kilka instrukcji operujących na tej samej strukturze, że wykonanie obu procedur naraz może zakłócić prawidłowe ich wykonywanie.
Celem przedstawionej konstrukcji jest uniemożliwienie wykonywania obu procedur naraz.
Poniższy przykład jest w C#, ale sprawa dotyczy kazdego języka obsługującego wielowątkowość.
// Zmienne globalne widoczne ze wszystkich wątków
bool Praca1 = false;
bool Praca2 = false;
// Wariant 1 - procedura jest wykonywana tylko wtedy, gdy można ją wykonać
public void Procedura1()
{
if (!Praca2)
{
Praca1 = true;
// jakies instrukcje
Praca1 = false;
}
}
public void Procedura2()
{
if (!Praca1)
{
Praca2 = true;
// jakies instrukcje
Praca2 = false;
}
}
// Wariant 2 - w przypadku niemożności wykonania procedury, oczekuje się na możliwość jej wykonania
public void Procedura1()
{
Praca1 = true;
while(Praca2)
{
}
// jakies instrukcje
Praca1 = false;
}
public void Procedura2()
{
Praca2 = true;
while(Praca1)
{
}
// jakies instrukcje
Praca2 = false;
}
Czy zmienne "Praca1" i "Praca2" to są semafory?