RosettaCodeData/Task/Dining-philosophers/Pike/dining-philosophers.pike
2023-07-01 13:44:08 -04:00

94 lines
2.2 KiB
Text

class Philosopher
{
string name;
object left;
object right;
void create(string _name, object _left, object _right)
{
name = _name;
left = _left;
right = _right;
}
void take_forks()
{
if (left->take(this) && right->take(this))
{
write("%s is EATING\n", name);
call_out(drop_forks, random(30));
}
else
{
write("%s is WAITING\n", name);
if (random(10) >= 8)
drop_forks();
call_out(take_forks, random(10));
}
}
void drop_forks()
{
left->drop(this);
right->drop(this);
write("%s is THINKING\n", name);
call_out(take_forks, random(30));
}
}
class Fork
{
int number;
Philosopher user;
void create(int _number)
{
number = _number;
}
int take(object new_user)
{
if (!user)
{
write("%s takes fork %d\n", new_user->name, number);
user = new_user;
return 1;
}
else if (new_user == user)
{
write("%s has fork %d\n", new_user->name, number);
return 1;
}
else
write("%s tries to take fork %d from %s\n", new_user->name, number, user->name);
}
void drop(object old_user)
{
if (old_user == user)
{
write("%s drops fork %d\n", old_user->name, number);
user = 0;
}
}
}
int main(int argc, array argv)
{
array forks = ({ Fork(1), Fork(2), Fork(3), Fork(4), Fork(5) });
array philosophers = ({
Philosopher("einstein", forks[0], forks[1]),
Philosopher("plato", forks[1], forks[2]),
Philosopher("sokrates", forks[2], forks[3]),
Philosopher("chomsky", forks[3], forks[4]),
Philosopher("archimedes", forks[4], forks[0]),
});
call_out(philosophers[0]->take_forks, random(5));
call_out(philosophers[1]->take_forks, random(5));
call_out(philosophers[2]->take_forks, random(5));
call_out(philosophers[3]->take_forks, random(5));
call_out(philosophers[4]->take_forks, random(5));
return -1;
}