<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://so.v2.cs.unibo.it/wiki/index.php?action=history&amp;feed=atom&amp;title=Problema_Dei_Filosofi</id>
	<title>Problema Dei Filosofi - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://so.v2.cs.unibo.it/wiki/index.php?action=history&amp;feed=atom&amp;title=Problema_Dei_Filosofi"/>
	<link rel="alternate" type="text/html" href="https://so.v2.cs.unibo.it/wiki/index.php?title=Problema_Dei_Filosofi&amp;action=history"/>
	<updated>2026-05-04T10:36:01Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.35.5</generator>
	<entry>
		<id>https://so.v2.cs.unibo.it/wiki/index.php?title=Problema_Dei_Filosofi&amp;diff=870&amp;oldid=prev</id>
		<title>Calvin42: Created page with &quot;Cinque filosofi passano la loro vita a pensare e a mangiare (alternativamente). Per mangiare fanno uso di una tavola rotonda con 5 sedie, 5 piatti e 5 posate fra i piatti per ...&quot;</title>
		<link rel="alternate" type="text/html" href="https://so.v2.cs.unibo.it/wiki/index.php?title=Problema_Dei_Filosofi&amp;diff=870&amp;oldid=prev"/>
		<updated>2015-02-28T13:34:08Z</updated>

		<summary type="html">&lt;p&gt;Created page with &amp;quot;Cinque filosofi passano la loro vita a pensare e a mangiare (alternativamente). Per mangiare fanno uso di una tavola rotonda con 5 sedie, 5 piatti e 5 posate fra i piatti per ...&amp;quot;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;Cinque filosofi passano la loro vita a pensare e a mangiare (alternativamente). Per mangiare fanno uso di una tavola rotonda con 5 sedie, 5 piatti e 5 posate fra i piatti per mangiare. Un filosofo, per mangiare, ha bisogno di entrambe le posate (destra/sinistra). Per pensare, lascia le posate dove le ha prese. Dato che prediligono gli spaghetti e che gli spaghetti non si mangiano con due forchette, utilizzeranno un paio di bacchette, ma il concetto rimane lo stesso.&lt;br /&gt;
Il problema dei filosofi mostra come gestire situazioni in cui i processi entrano in competizione per accedere ad insiemi di risorse a intersezione non nulla.&lt;br /&gt;
&lt;br /&gt;
==Implementazione==&lt;br /&gt;
Ho utilizzato la libreria &amp;quot;semaphore.h&amp;quot; per gestire i semafori.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;stdlib.h&amp;gt;&lt;br /&gt;
#include &amp;lt;semaphore.h&amp;gt;&lt;br /&gt;
#include &amp;lt;unistd.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
sem_t chopstick[5];&lt;br /&gt;
&lt;br /&gt;
void dining(int i)&lt;br /&gt;
{&lt;br /&gt;
	pid_t pid=fork();&lt;br /&gt;
	if (pid==-1)&lt;br /&gt;
		exit(2);&lt;br /&gt;
	if (pid)&lt;br /&gt;
	{&lt;br /&gt;
		printf(&amp;quot;Sono il %d figlio di %i!\n\n\n&amp;quot;, i, getppid());&lt;br /&gt;
//		while(1)&lt;br /&gt;
		{&lt;br /&gt;
			printf(&amp;quot;%d sta pensando...\n&amp;quot;, getpid());&lt;br /&gt;
			sem_wait(&amp;amp;(chopstick[i]));&lt;br /&gt;
			sem_wait(&amp;amp;(chopstick[(i+1)%5]));&lt;br /&gt;
			printf(&amp;quot;%d sta mangiando...\n&amp;quot;, getpid());&lt;br /&gt;
			sem_post(&amp;amp;(chopstick[i]));&lt;br /&gt;
			sem_post(&amp;amp;(chopstick[(i+1)%5]));&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
	}&lt;br /&gt;
	else  /*  processo figlio */&lt;br /&gt;
		if((i+1)!=5)&lt;br /&gt;
		{&lt;br /&gt;
			dining(i+1);&lt;br /&gt;
		}&lt;br /&gt;
		else /* Non ci sono filosofi rimanenti */&lt;br /&gt;
		{&lt;br /&gt;
			printf(&amp;quot;Hanno pensato e mangiato tutti!\n&amp;quot;);&lt;br /&gt;
			return;&lt;br /&gt;
		}&lt;br /&gt;
    return;&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
int main(int argc, char* argv[])&lt;br /&gt;
{&lt;br /&gt;
    pid_t pid;&lt;br /&gt;
	int i;&lt;br /&gt;
	/* Inizializzo i semafori&lt;br /&gt;
	 * il primo parametro e' l'indirizzo del semaforo&lt;br /&gt;
	 * il secondo e' 0 se si utilizzano i thread, altrimenti processo&lt;br /&gt;
	 * il terzo e' il valore iniziale&lt;br /&gt;
	 */&lt;br /&gt;
	for(i=0; i&amp;lt;5; i++)&lt;br /&gt;
		sem_init(&amp;amp;(chopstick[i]), 1, 1);&lt;br /&gt;
    &lt;br /&gt;
	i=1; /*i diventa 1 perche' il primo filosofo lo faccio mangiare subito */&lt;br /&gt;
&lt;br /&gt;
	pid=fork();&lt;br /&gt;
&lt;br /&gt;
	if(pid==-1)&lt;br /&gt;
	{&lt;br /&gt;
        exit(2);//errore&lt;br /&gt;
	}&lt;br /&gt;
	else &lt;br /&gt;
		if (pid)&lt;br /&gt;
		{&lt;br /&gt;
			/* Per rompere la simmetria faccio mangiare per primo un filosofo&lt;br /&gt;
			 * in questo caso il filosofo 0&lt;br /&gt;
			 */&lt;br /&gt;
			printf(&amp;quot;Sono %d, il padre di tutti!\\n\n\n&amp;quot;, getpid());&lt;br /&gt;
//			while(1)&lt;br /&gt;
			{&lt;br /&gt;
				printf(&amp;quot;%d sta pensando...\n&amp;quot;, getpid());&lt;br /&gt;
				sem_wait(&amp;amp;(chopstick[1]));&lt;br /&gt;
				sem_wait(&amp;amp;(chopstick[0]));&lt;br /&gt;
				printf(&amp;quot;%d sta mangiando...\n&amp;quot;, getpid());&lt;br /&gt;
				sem_post(&amp;amp;(chopstick[1]));&lt;br /&gt;
				sem_post(&amp;amp;(chopstick[0]));&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
		else  /* Primo processo figlio */&lt;br /&gt;
		{&lt;br /&gt;
            printf(&amp;quot;Padre: %d\n\n&amp;quot;, getppid());&lt;br /&gt;
			dining(i);&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
	return 0;		&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Commenti ==&lt;br /&gt;
Ho rimosso il while(1) per evitare che il programma andasse in loop, quindi il problema viene risolto una sola volta. Ho effettivamente scritto un programma che ricorsivamente crea dei processi '''fratelli''', e non figli, del primo processo '''figlio''', come si puo' vedere dall'output.&lt;br /&gt;
&lt;br /&gt;
[[File:Output_filosofi_c.png|300 px]]&lt;/div&gt;</summary>
		<author><name>Calvin42</name></author>
	</entry>
</feed>