<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://so.v2.cs.unibo.it/wiki/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Matteo.pincherle</id>
	<title>Sistemi Operativi - User contributions [en]</title>
	<link rel="self" type="application/atom+xml" href="https://so.v2.cs.unibo.it/wiki/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Matteo.pincherle"/>
	<link rel="alternate" type="text/html" href="https://so.v2.cs.unibo.it/wiki/index.php/Special:Contributions/Matteo.pincherle"/>
	<updated>2026-05-04T01:52:34Z</updated>
	<subtitle>User contributions</subtitle>
	<generator>MediaWiki 1.35.5</generator>
	<entry>
		<id>https://so.v2.cs.unibo.it/wiki/index.php?title=Zibaldone&amp;diff=1582</id>
		<title>Zibaldone</title>
		<link rel="alternate" type="text/html" href="https://so.v2.cs.unibo.it/wiki/index.php?title=Zibaldone&amp;diff=1582"/>
		<updated>2016-11-13T11:59:08Z</updated>

		<summary type="html">&lt;p&gt;Matteo.pincherle: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== RW errato ==&lt;br /&gt;
Codice '''ERRATO''' dei lettori scrittori che dovrebbe non soffrire di problemi di starvation...&lt;br /&gt;
Esercizio: trovare gli errori.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=C&amp;gt;&lt;br /&gt;
#include&amp;lt;stdio.h&amp;gt;&lt;br /&gt;
#include&amp;lt;stdint.h&amp;gt;&lt;br /&gt;
#include&amp;lt;pthread.h&amp;gt;&lt;br /&gt;
#include&amp;lt;semaphore.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#define NREADER 3&lt;br /&gt;
#define NWRITER 3&lt;br /&gt;
semaphore mutex;&lt;br /&gt;
semaphore ok2read;&lt;br /&gt;
semaphore ok2write;&lt;br /&gt;
&lt;br /&gt;
int nr=0;&lt;br /&gt;
int nw=0;&lt;br /&gt;
int wr=0;&lt;br /&gt;
int ww=0;&lt;br /&gt;
int w_last;&lt;br /&gt;
&lt;br /&gt;
// (nw == 0 &amp;amp;&amp;amp; nr == 0) || (nr &amp;gt; 0 &amp;amp;&amp;amp; nw == 0) || nw == 1&lt;br /&gt;
// (nw == 0 &amp;amp;&amp;amp; nr &amp;gt;= 0) || nw == 1&lt;br /&gt;
&lt;br /&gt;
// this &amp;quot;baton&amp;quot; function has been left for reference only.&lt;br /&gt;
// code to implement &amp;quot;passing the baton&amp;quot; has been copied at the end of&lt;br /&gt;
// each ({start}|{end})({read}|{write}) function and reduced.&lt;br /&gt;
void baton(void) {&lt;br /&gt;
        if (nw == 0 &amp;amp;&amp;amp; nr == 0 &amp;amp;&amp;amp; ww &amp;gt; 0)&lt;br /&gt;
                semaphore_V(ok2write);&lt;br /&gt;
        else if (nw == 0 &amp;amp;&amp;amp; wr &amp;gt; 0 )&lt;br /&gt;
                semaphore_V(ok2read);&lt;br /&gt;
        else&lt;br /&gt;
                semaphore_V(mutex);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void startread(void) {&lt;br /&gt;
// &amp;lt;await nw == 0 -&amp;gt; nr++&amp;gt;&lt;br /&gt;
        semaphore_P(mutex);&lt;br /&gt;
        if (nw &amp;gt; 0 &amp;amp;&amp;amp; ww == 0) {&lt;br /&gt;
                wr++;&lt;br /&gt;
                semaphore_V(mutex);&lt;br /&gt;
                semaphore_P(ok2read);&lt;br /&gt;
                wr--;&lt;br /&gt;
        }&lt;br /&gt;
        nr++;&lt;br /&gt;
        w_last=0;&lt;br /&gt;
        printf(&amp;quot;NR %d - NW %d - WR %d - WW %d \n&amp;quot;, nr, nw, wr, ww);&lt;br /&gt;
        if (wr &amp;gt; 0 )&lt;br /&gt;
                semaphore_V(ok2read);&lt;br /&gt;
        else&lt;br /&gt;
                semaphore_V(mutex);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void endread(void) {&lt;br /&gt;
// &amp;lt;nr--&amp;gt;&lt;br /&gt;
        semaphore_P(mutex);&lt;br /&gt;
        nr--;&lt;br /&gt;
        printf(&amp;quot;NR %d - NW %d - WR %d - WW %d \n&amp;quot;, nr, nw, wr, ww);&lt;br /&gt;
        if (nr == 0 &amp;amp;&amp;amp; ww &amp;gt; 0)&lt;br /&gt;
                semaphore_V(ok2write);&lt;br /&gt;
        else&lt;br /&gt;
                semaphore_V(mutex);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void startwrite(void) {&lt;br /&gt;
// &amp;lt;await nw == 0 &amp;amp;&amp;amp; nr == 0 -&amp;gt; nw++&amp;gt;&lt;br /&gt;
        semaphore_P(mutex);&lt;br /&gt;
        if (nw &amp;gt; 0 || nr &amp;gt; 0) {&lt;br /&gt;
                ww++;&lt;br /&gt;
                semaphore_V(mutex);&lt;br /&gt;
                semaphore_P(ok2write);&lt;br /&gt;
                ww--;&lt;br /&gt;
        }&lt;br /&gt;
        nw++;&lt;br /&gt;
        w_last=1;&lt;br /&gt;
        printf(&amp;quot;NR %d - NW %d - WR %d - WW %d \n&amp;quot;, nr, nw, wr, ww);&lt;br /&gt;
        semaphore_V(mutex);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void endwrite(void) {&lt;br /&gt;
// &amp;lt;nw--&amp;gt;&lt;br /&gt;
        semaphore_P(mutex);&lt;br /&gt;
        nw--;&lt;br /&gt;
        printf(&amp;quot;NR %d - NW %d - WR %d - WW %d \n&amp;quot;, nr, nw, wr, ww);&lt;br /&gt;
        if (wr &amp;gt; 0 &amp;amp;&amp;amp; (ww == 0 || w_last))&lt;br /&gt;
                semaphore_V(ok2read);&lt;br /&gt;
        else if (ww &amp;gt; 0 &amp;amp;&amp;amp; (wr == 0 || !w_last))&lt;br /&gt;
                semaphore_V(ok2write);&lt;br /&gt;
        else&lt;br /&gt;
                semaphore_V(mutex);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void *reader(void *arg) {&lt;br /&gt;
        int i = (uintptr_t)arg;&lt;br /&gt;
        while (1) {&lt;br /&gt;
                //other code&lt;br /&gt;
                usleep(random() % 200000);&lt;br /&gt;
                startread();&lt;br /&gt;
                //read&lt;br /&gt;
                usleep(random() % 200000);&lt;br /&gt;
                endread();&lt;br /&gt;
        }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void *writer(void *arg) {&lt;br /&gt;
        int i = (uintptr_t)arg;&lt;br /&gt;
        while (1) {&lt;br /&gt;
                //other code&lt;br /&gt;
                usleep(random() % 200000);&lt;br /&gt;
                startwrite();&lt;br /&gt;
                //write&lt;br /&gt;
                usleep(random() % 200000);&lt;br /&gt;
                endwrite();&lt;br /&gt;
        }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
//printf(&amp;quot;philo thinking: %d\n&amp;quot;,i);&lt;br /&gt;
/*while*/&lt;br /&gt;
&lt;br /&gt;
int main(int argc, char *argv[]) {&lt;br /&gt;
        int i;&lt;br /&gt;
        pthread_t t;&lt;br /&gt;
        srandom(time(NULL));&lt;br /&gt;
        mutex=semaphore_create(1);&lt;br /&gt;
        ok2read=semaphore_create(0);&lt;br /&gt;
        ok2write=semaphore_create(0);&lt;br /&gt;
        for (i=0; i&amp;lt;NREADER; i++)&lt;br /&gt;
                pthread_create(&amp;amp;t, NULL, reader, (void *)(uintptr_t) i);&lt;br /&gt;
        for (i=0; i&amp;lt;NWRITER; i++)&lt;br /&gt;
                pthread_create(&amp;amp;t, NULL, writer, (void *)(uintptr_t) i);&lt;br /&gt;
        while(1)&lt;br /&gt;
                pause();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== RW di FedericoB ==&lt;br /&gt;
Propongo la seguente soluzione. Mi sembra che funzioni ma devo ancora capire perchè e documentarla bene. Ho provato prima a cercare il bug ma non ci sono riuscito. Ho quindi modificato il codice secondo ciò che mi sembrava sensato in base alle condizioni del problema. Ne possiamo parlare in aula oggi. --[[User:FedericoB|FedericoB]] ([[User talk:FedericoB|talk]]) 12:48, 11 November 2016 (CET)&lt;br /&gt;
Ho notato che l'errore non si manifesta più eliminando il controllo che ci siano scrittori in attesa quando un lettore vuole iniziare a scrivere. Non capisco come questo possa essere collegato al bug. --[[User:FedericoB|FedericoB]] ([[User talk:FedericoB|talk]]) 15:10, 11 November 2016 (CET)&lt;br /&gt;
&lt;br /&gt;
FedericoB, questa soluzione &amp;amp;egrave; quella con priorit&amp;amp;agrave; ai lettori, no? Se continuano ad arrivare lettori numberOfReaders non sar&amp;amp;agrave; mai zero e quindi gli scrittori non scriveranno mai. [[User:Renzo|Renzo]] ([[User talk:Renzo|talk]]) 10:34, 12 November 2016 (CET)&lt;br /&gt;
&lt;br /&gt;
SFIDA: ho trovato il modo di togliere la starvation aggiungendo 4 token (parole chiave, nomi di variabili, operatori, costanti) a questa soluzione di FedericoB. Chi trova la soluzione? [[User:Renzo|Renzo]] ([[User talk:Renzo|talk]]) 10:43, 12 November 2016 (CET) Ah! ho appena trovato una soluzione che prevede 2 soli token in pi&amp;amp;ugrave;! [[User:Renzo|Renzo]] ([[User talk:Renzo|talk]]) 10:47, 12 November 2016 (CET)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=C&amp;gt;&lt;br /&gt;
#include&amp;lt;stdio.h&amp;gt;&lt;br /&gt;
#include&amp;lt;stdint.h&amp;gt;&lt;br /&gt;
#include&amp;lt;pthread.h&amp;gt;&lt;br /&gt;
#include&amp;lt;semaphore.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#define NUMBER_OF_READERS 3&lt;br /&gt;
#define NUMBER_OF_WRITERS 3&lt;br /&gt;
semaphore mutex;&lt;br /&gt;
semaphore ok2read;&lt;br /&gt;
semaphore ok2write;&lt;br /&gt;
&lt;br /&gt;
int numberOfReaders=0;&lt;br /&gt;
int numberOfWriters=0;&lt;br /&gt;
int waitingReaders=0;&lt;br /&gt;
int waitingWriters=0;&lt;br /&gt;
&lt;br /&gt;
// (nw == 0 &amp;amp;&amp;amp; nr == 0) || (nr &amp;gt; 0 &amp;amp;&amp;amp; nw == 0) || nw == 1&lt;br /&gt;
// (nw == 0 &amp;amp;&amp;amp; nr &amp;gt;= 0) || nw == 1&lt;br /&gt;
&lt;br /&gt;
void startread(void) {&lt;br /&gt;
// &amp;lt;await nw == 0 -&amp;gt; nr++&amp;gt;&lt;br /&gt;
    semaphore_P(mutex);&lt;br /&gt;
    if (numberOfWriters &amp;gt; 0) {&lt;br /&gt;
        waitingReaders++;&lt;br /&gt;
        semaphore_V(mutex);&lt;br /&gt;
        semaphore_P(ok2read);&lt;br /&gt;
        waitingReaders--;&lt;br /&gt;
    }&lt;br /&gt;
    numberOfReaders++;&lt;br /&gt;
    printf(&amp;quot;NR %d - NW %d - WR %d - WW %d \n&amp;quot;, numberOfReaders, numberOfWriters, waitingReaders, waitingWriters);&lt;br /&gt;
    if (waitingReaders &amp;gt; 0 )&lt;br /&gt;
        semaphore_V(ok2read);&lt;br /&gt;
    else&lt;br /&gt;
        semaphore_V(mutex);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void endread(void) {&lt;br /&gt;
// &amp;lt;nr--&amp;gt;&lt;br /&gt;
    semaphore_P(mutex);&lt;br /&gt;
    numberOfReaders--;&lt;br /&gt;
    printf(&amp;quot;NR %d - NW %d - WR %d - WW %d \n&amp;quot;, numberOfReaders, numberOfWriters, waitingReaders, waitingWriters);&lt;br /&gt;
    if (numberOfReaders == 0 &amp;amp;&amp;amp; waitingWriters &amp;gt; 0)&lt;br /&gt;
        semaphore_V(ok2write);&lt;br /&gt;
    else&lt;br /&gt;
        semaphore_V(mutex);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void startwrite(void) {&lt;br /&gt;
// &amp;lt;await nw == 0 &amp;amp;&amp;amp; nr == 0 -&amp;gt; nw++&amp;gt;&lt;br /&gt;
    semaphore_P(mutex);&lt;br /&gt;
    if (numberOfWriters &amp;gt; 0 || numberOfReaders &amp;gt; 0) {&lt;br /&gt;
        waitingWriters++;&lt;br /&gt;
        semaphore_V(mutex);&lt;br /&gt;
        semaphore_P(ok2write);&lt;br /&gt;
        waitingWriters--;&lt;br /&gt;
    }&lt;br /&gt;
    numberOfWriters++;&lt;br /&gt;
    printf(&amp;quot;NR %d - NW %d - WR %d - WW %d \n&amp;quot;, numberOfReaders, numberOfWriters, waitingReaders, waitingWriters);&lt;br /&gt;
    semaphore_V(mutex);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void endwrite(void) {&lt;br /&gt;
// &amp;lt;nw--&amp;gt;&lt;br /&gt;
    semaphore_P(mutex);&lt;br /&gt;
    numberOfWriters--;&lt;br /&gt;
    printf(&amp;quot;NR %d - NW %d - WR %d - WW %d \n&amp;quot;, numberOfReaders, numberOfWriters, waitingReaders, waitingWriters);&lt;br /&gt;
    if (waitingReaders &amp;gt; 0)&lt;br /&gt;
        semaphore_V(ok2read);&lt;br /&gt;
    else if (waitingWriters &amp;gt; 0)&lt;br /&gt;
        semaphore_V(ok2write);&lt;br /&gt;
    else&lt;br /&gt;
        semaphore_V(mutex);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void *reader(void *arg) {&lt;br /&gt;
    int i = (uintptr_t)arg;&lt;br /&gt;
    while (1) {&lt;br /&gt;
        //other code&lt;br /&gt;
        usleep(random() % 200000);&lt;br /&gt;
        startread();&lt;br /&gt;
        //read&lt;br /&gt;
        usleep(random() % 200000);&lt;br /&gt;
        endread();&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void *writer(void *arg) {&lt;br /&gt;
    int i = (uintptr_t)arg;&lt;br /&gt;
    while (1) {&lt;br /&gt;
        //other code&lt;br /&gt;
        usleep(random() % 200000);&lt;br /&gt;
        startwrite();&lt;br /&gt;
        //write&lt;br /&gt;
        usleep(random() % 200000);&lt;br /&gt;
        endwrite();&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
//printf(&amp;quot;philo thinking: %d\n&amp;quot;,i);&lt;br /&gt;
/*while*/&lt;br /&gt;
&lt;br /&gt;
int main(int argc, char *argv[]) {&lt;br /&gt;
    int i;&lt;br /&gt;
    pthread_t t;&lt;br /&gt;
    srandom(time(NULL));&lt;br /&gt;
    mutex=semaphore_create(1);&lt;br /&gt;
    ok2read=semaphore_create(0);&lt;br /&gt;
    ok2write=semaphore_create(0);&lt;br /&gt;
    for (i=0; i&amp;lt;NUMBER_OF_READERS; i++)&lt;br /&gt;
        pthread_create(&amp;amp;t, NULL, reader, (void *)(uintptr_t) i);&lt;br /&gt;
    for (i=0; i&amp;lt;NUMBER_OF_WRITERS; i++)&lt;br /&gt;
        pthread_create(&amp;amp;t, NULL, writer, (void *)(uintptr_t) i);&lt;br /&gt;
    while(1)&lt;br /&gt;
        pause();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== RW2 ==&lt;br /&gt;
Buongiorno, guardando il codice visto a lezione mi sembra che cambiando la condizione del primo if nella startread() da &amp;quot;if (nw &amp;gt; 0 &amp;amp;&amp;amp; ww == 0)&amp;quot; a &amp;quot;if (nw &amp;gt; 0 || ww &amp;gt; 0)&amp;quot; la situazione migliori. In particolare con l'and tra quelle due condizioni si aveva che non veniva fatta la P sull'ok2read anche quando si aveva nw&amp;gt;0 (con ww!=0), cosa che invece dovrebbe fare. Lasciando il resto del codice uguale mi sembra che faccia quello che deve fare.. .&lt;br /&gt;
&lt;br /&gt;
Matteo.pincherle: Perch&amp;amp;eacute; non modifichi in programma di FedericoB, lo provi e pubblichi qui la patch? [[User:Renzo|Renzo]] ([[User talk:Renzo|talk]]) 10:42, 13 November 2016 (CET)&lt;br /&gt;
&lt;br /&gt;
== Patch ==&lt;br /&gt;
Così, se non sbaglio, quando c'è almeno uno scrittore in attesa non lascia entrare altri lettori. Fa esaurire la lettura dei presenti e poi lascia scrivere lo scrittore.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=C&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#include&amp;lt;stdio.h&amp;gt;&lt;br /&gt;
#include&amp;lt;stdint.h&amp;gt;&lt;br /&gt;
#include&amp;lt;pthread.h&amp;gt;&lt;br /&gt;
#include&amp;lt;semaphore.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#define NUMBER_OF_READERS 3&lt;br /&gt;
#define NUMBER_OF_WRITERS 3&lt;br /&gt;
semaphore mutex;&lt;br /&gt;
semaphore ok2read;&lt;br /&gt;
semaphore ok2write;&lt;br /&gt;
&lt;br /&gt;
int numberOfReaders=0;&lt;br /&gt;
int numberOfWriters=0;&lt;br /&gt;
int waitingReaders=0;&lt;br /&gt;
int waitingWriters=0;&lt;br /&gt;
int w_last;&lt;br /&gt;
&lt;br /&gt;
// (nw == 0 &amp;amp;&amp;amp; nr == 0) || (nr &amp;gt; 0 &amp;amp;&amp;amp; nw == 0) || nw == 1&lt;br /&gt;
// (nw == 0 &amp;amp;&amp;amp; nr &amp;gt;= 0) || nw == 1&lt;br /&gt;
&lt;br /&gt;
void startread(void) {&lt;br /&gt;
    // &amp;lt;await nw == 0 -&amp;gt; nr++&amp;gt;&lt;br /&gt;
    semaphore_P(mutex);&lt;br /&gt;
    if (numberOfWriters &amp;gt; 0 || waitingWriters&amp;gt;0) {&lt;br /&gt;
        waitingReaders++;&lt;br /&gt;
        semaphore_V(mutex);&lt;br /&gt;
        semaphore_P(ok2read);&lt;br /&gt;
        waitingReaders--;&lt;br /&gt;
    }&lt;br /&gt;
    numberOfReaders++;&lt;br /&gt;
    w_last=0;&lt;br /&gt;
    printf(&amp;quot;NR %d - NW %d - WR %d - WW %d \n&amp;quot;, numberOfReaders, numberOfWriters, waitingReaders, waitingWriters);&lt;br /&gt;
    if (waitingReaders &amp;gt; 0 )&lt;br /&gt;
        semaphore_V(ok2read);&lt;br /&gt;
    else&lt;br /&gt;
        semaphore_V(mutex);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void endread(void) {&lt;br /&gt;
    // &amp;lt;nr--&amp;gt;&lt;br /&gt;
    semaphore_P(mutex);&lt;br /&gt;
    numberOfReaders--;&lt;br /&gt;
    printf(&amp;quot;NR %d - NW %d - WR %d - WW %d \n&amp;quot;, numberOfReaders, numberOfWriters, waitingReaders, waitingWriters);&lt;br /&gt;
    if (numberOfReaders == 0 &amp;amp;&amp;amp; waitingWriters &amp;gt; 0)&lt;br /&gt;
        semaphore_V(ok2write);&lt;br /&gt;
    else&lt;br /&gt;
        semaphore_V(mutex);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void startwrite(void) {&lt;br /&gt;
    // &amp;lt;await nw == 0 &amp;amp;&amp;amp; nr == 0 -&amp;gt; nw++&amp;gt;&lt;br /&gt;
    semaphore_P(mutex);&lt;br /&gt;
    if (numberOfWriters &amp;gt; 0 || numberOfReaders &amp;gt; 0) {&lt;br /&gt;
        waitingWriters++;&lt;br /&gt;
        semaphore_V(mutex);&lt;br /&gt;
        semaphore_P(ok2write);&lt;br /&gt;
        waitingWriters--;&lt;br /&gt;
    }&lt;br /&gt;
    numberOfWriters++;&lt;br /&gt;
    w_last=1;&lt;br /&gt;
    printf(&amp;quot;NR %d - NW %d - WR %d - WW %d \n&amp;quot;, numberOfReaders, numberOfWriters, waitingReaders, waitingWriters);&lt;br /&gt;
    semaphore_V(mutex);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void endwrite(void) {&lt;br /&gt;
    // &amp;lt;nw--&amp;gt;&lt;br /&gt;
    semaphore_P(mutex);&lt;br /&gt;
    numberOfWriters--;&lt;br /&gt;
    printf(&amp;quot;NR %d - NW %d - WR %d - WW %d \n&amp;quot;, numberOfReaders, numberOfWriters, waitingReaders, waitingWriters);&lt;br /&gt;
    if (waitingReaders &amp;gt; 0 &amp;amp;&amp;amp; (waitingWriters==0 || w_last))&lt;br /&gt;
        semaphore_V(ok2read);&lt;br /&gt;
    else if (waitingWriters &amp;gt; 0 &amp;amp;&amp;amp; (waitingReaders==0 || !w_last))&lt;br /&gt;
        semaphore_V(ok2write);&lt;br /&gt;
    else&lt;br /&gt;
        semaphore_V(mutex);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void *reader(void *arg) {&lt;br /&gt;
    int i = (uintptr_t)arg;&lt;br /&gt;
    while (1) {&lt;br /&gt;
        //other code&lt;br /&gt;
        usleep(random() % 200000);&lt;br /&gt;
        startread();&lt;br /&gt;
        //read&lt;br /&gt;
        usleep(random() % 200000);&lt;br /&gt;
        endread();&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void *writer(void *arg) {&lt;br /&gt;
    int i = (uintptr_t)arg;&lt;br /&gt;
    while (1) {&lt;br /&gt;
        //other code&lt;br /&gt;
        usleep(random() % 200000);&lt;br /&gt;
        startwrite();&lt;br /&gt;
        //write&lt;br /&gt;
        usleep(random() % 200000);&lt;br /&gt;
        endwrite();&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int main(int argc, char *argv[]) {&lt;br /&gt;
    int i;&lt;br /&gt;
    pthread_t t;&lt;br /&gt;
    srandom(time(NULL));&lt;br /&gt;
    mutex=semaphore_create(1);&lt;br /&gt;
    ok2read=semaphore_create(0);&lt;br /&gt;
    ok2write=semaphore_create(0);&lt;br /&gt;
    for (i=0; i&amp;lt;NUMBER_OF_READERS; i++)&lt;br /&gt;
        pthread_create(&amp;amp;t, NULL, reader, (void *)(uintptr_t) i);&lt;br /&gt;
    for (i=0; i&amp;lt;NUMBER_OF_WRITERS; i++)&lt;br /&gt;
        pthread_create(&amp;amp;t, NULL, writer, (void *)(uintptr_t) i);&lt;br /&gt;
    while(1)&lt;br /&gt;
        pause();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Matteo.pincherle</name></author>
	</entry>
	<entry>
		<id>https://so.v2.cs.unibo.it/wiki/index.php?title=Zibaldone&amp;diff=1580</id>
		<title>Zibaldone</title>
		<link rel="alternate" type="text/html" href="https://so.v2.cs.unibo.it/wiki/index.php?title=Zibaldone&amp;diff=1580"/>
		<updated>2016-11-12T14:48:50Z</updated>

		<summary type="html">&lt;p&gt;Matteo.pincherle: /* RW2 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== RW errato ==&lt;br /&gt;
Codice '''ERRATO''' dei lettori scrittori che dovrebbe non soffrire di problemi di starvation...&lt;br /&gt;
Esercizio: trovare gli errori.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=C&amp;gt;&lt;br /&gt;
#include&amp;lt;stdio.h&amp;gt;&lt;br /&gt;
#include&amp;lt;stdint.h&amp;gt;&lt;br /&gt;
#include&amp;lt;pthread.h&amp;gt;&lt;br /&gt;
#include&amp;lt;semaphore.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#define NREADER 3&lt;br /&gt;
#define NWRITER 3&lt;br /&gt;
semaphore mutex;&lt;br /&gt;
semaphore ok2read;&lt;br /&gt;
semaphore ok2write;&lt;br /&gt;
&lt;br /&gt;
int nr=0;&lt;br /&gt;
int nw=0;&lt;br /&gt;
int wr=0;&lt;br /&gt;
int ww=0;&lt;br /&gt;
int w_last;&lt;br /&gt;
&lt;br /&gt;
// (nw == 0 &amp;amp;&amp;amp; nr == 0) || (nr &amp;gt; 0 &amp;amp;&amp;amp; nw == 0) || nw == 1&lt;br /&gt;
// (nw == 0 &amp;amp;&amp;amp; nr &amp;gt;= 0) || nw == 1&lt;br /&gt;
&lt;br /&gt;
// this &amp;quot;baton&amp;quot; function has been left for reference only.&lt;br /&gt;
// code to implement &amp;quot;passing the baton&amp;quot; has been copied at the end of&lt;br /&gt;
// each ({start}|{end})({read}|{write}) function and reduced.&lt;br /&gt;
void baton(void) {&lt;br /&gt;
        if (nw == 0 &amp;amp;&amp;amp; nr == 0 &amp;amp;&amp;amp; ww &amp;gt; 0)&lt;br /&gt;
                semaphore_V(ok2write);&lt;br /&gt;
        else if (nw == 0 &amp;amp;&amp;amp; wr &amp;gt; 0 )&lt;br /&gt;
                semaphore_V(ok2read);&lt;br /&gt;
        else&lt;br /&gt;
                semaphore_V(mutex);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void startread(void) {&lt;br /&gt;
// &amp;lt;await nw == 0 -&amp;gt; nr++&amp;gt;&lt;br /&gt;
        semaphore_P(mutex);&lt;br /&gt;
        if (nw &amp;gt; 0 &amp;amp;&amp;amp; ww == 0) {&lt;br /&gt;
                wr++;&lt;br /&gt;
                semaphore_V(mutex);&lt;br /&gt;
                semaphore_P(ok2read);&lt;br /&gt;
                wr--;&lt;br /&gt;
        }&lt;br /&gt;
        nr++;&lt;br /&gt;
        w_last=0;&lt;br /&gt;
        printf(&amp;quot;NR %d - NW %d - WR %d - WW %d \n&amp;quot;, nr, nw, wr, ww);&lt;br /&gt;
        if (wr &amp;gt; 0 )&lt;br /&gt;
                semaphore_V(ok2read);&lt;br /&gt;
        else&lt;br /&gt;
                semaphore_V(mutex);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void endread(void) {&lt;br /&gt;
// &amp;lt;nr--&amp;gt;&lt;br /&gt;
        semaphore_P(mutex);&lt;br /&gt;
        nr--;&lt;br /&gt;
        printf(&amp;quot;NR %d - NW %d - WR %d - WW %d \n&amp;quot;, nr, nw, wr, ww);&lt;br /&gt;
        if (nr == 0 &amp;amp;&amp;amp; ww &amp;gt; 0)&lt;br /&gt;
                semaphore_V(ok2write);&lt;br /&gt;
        else&lt;br /&gt;
                semaphore_V(mutex);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void startwrite(void) {&lt;br /&gt;
// &amp;lt;await nw == 0 &amp;amp;&amp;amp; nr == 0 -&amp;gt; nw++&amp;gt;&lt;br /&gt;
        semaphore_P(mutex);&lt;br /&gt;
        if (nw &amp;gt; 0 || nr &amp;gt; 0) {&lt;br /&gt;
                ww++;&lt;br /&gt;
                semaphore_V(mutex);&lt;br /&gt;
                semaphore_P(ok2write);&lt;br /&gt;
                ww--;&lt;br /&gt;
        }&lt;br /&gt;
        nw++;&lt;br /&gt;
        w_last=1;&lt;br /&gt;
        printf(&amp;quot;NR %d - NW %d - WR %d - WW %d \n&amp;quot;, nr, nw, wr, ww);&lt;br /&gt;
        semaphore_V(mutex);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void endwrite(void) {&lt;br /&gt;
// &amp;lt;nw--&amp;gt;&lt;br /&gt;
        semaphore_P(mutex);&lt;br /&gt;
        nw--;&lt;br /&gt;
        printf(&amp;quot;NR %d - NW %d - WR %d - WW %d \n&amp;quot;, nr, nw, wr, ww);&lt;br /&gt;
        if (wr &amp;gt; 0 &amp;amp;&amp;amp; (ww == 0 || w_last))&lt;br /&gt;
                semaphore_V(ok2read);&lt;br /&gt;
        else if (ww &amp;gt; 0 &amp;amp;&amp;amp; (wr == 0 || !w_last))&lt;br /&gt;
                semaphore_V(ok2write);&lt;br /&gt;
        else&lt;br /&gt;
                semaphore_V(mutex);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void *reader(void *arg) {&lt;br /&gt;
        int i = (uintptr_t)arg;&lt;br /&gt;
        while (1) {&lt;br /&gt;
                //other code&lt;br /&gt;
                usleep(random() % 200000);&lt;br /&gt;
                startread();&lt;br /&gt;
                //read&lt;br /&gt;
                usleep(random() % 200000);&lt;br /&gt;
                endread();&lt;br /&gt;
        }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void *writer(void *arg) {&lt;br /&gt;
        int i = (uintptr_t)arg;&lt;br /&gt;
        while (1) {&lt;br /&gt;
                //other code&lt;br /&gt;
                usleep(random() % 200000);&lt;br /&gt;
                startwrite();&lt;br /&gt;
                //write&lt;br /&gt;
                usleep(random() % 200000);&lt;br /&gt;
                endwrite();&lt;br /&gt;
        }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
//printf(&amp;quot;philo thinking: %d\n&amp;quot;,i);&lt;br /&gt;
/*while*/&lt;br /&gt;
&lt;br /&gt;
int main(int argc, char *argv[]) {&lt;br /&gt;
        int i;&lt;br /&gt;
        pthread_t t;&lt;br /&gt;
        srandom(time(NULL));&lt;br /&gt;
        mutex=semaphore_create(1);&lt;br /&gt;
        ok2read=semaphore_create(0);&lt;br /&gt;
        ok2write=semaphore_create(0);&lt;br /&gt;
        for (i=0; i&amp;lt;NREADER; i++)&lt;br /&gt;
                pthread_create(&amp;amp;t, NULL, reader, (void *)(uintptr_t) i);&lt;br /&gt;
        for (i=0; i&amp;lt;NWRITER; i++)&lt;br /&gt;
                pthread_create(&amp;amp;t, NULL, writer, (void *)(uintptr_t) i);&lt;br /&gt;
        while(1)&lt;br /&gt;
                pause();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== RW di FedericoB ==&lt;br /&gt;
Propongo la seguente soluzione. Mi sembra che funzioni ma devo ancora capire perchè e documentarla bene. Ho provato prima a cercare il bug ma non ci sono riuscito. Ho quindi modificato il codice secondo ciò che mi sembrava sensato in base alle condizioni del problema. Ne possiamo parlare in aula oggi. --[[User:FedericoB|FedericoB]] ([[User talk:FedericoB|talk]]) 12:48, 11 November 2016 (CET)&lt;br /&gt;
Ho notato che l'errore non si manifesta più eliminando il controllo che ci siano scrittori in attesa quando un lettore vuole iniziare a scrivere. Non capisco come questo possa essere collegato al bug. --[[User:FedericoB|FedericoB]] ([[User talk:FedericoB|talk]]) 15:10, 11 November 2016 (CET)&lt;br /&gt;
&lt;br /&gt;
FedericoB, questa soluzione &amp;amp;egrave; quella con priorit&amp;amp;agrave; ai lettori, no? Se continuano ad arrivare lettori numberOfReaders non sar&amp;amp;agrave; mai zero e quindi gli scrittori non scriveranno mai. [[User:Renzo|Renzo]] ([[User talk:Renzo|talk]]) 10:34, 12 November 2016 (CET)&lt;br /&gt;
&lt;br /&gt;
SFIDA: ho trovato il modo di togliere la starvation aggiungendo 4 token (parole chiave, nomi di variabili, operatori, costanti) a questa soluzione di FedericoB. Chi trova la soluzione? [[User:Renzo|Renzo]] ([[User talk:Renzo|talk]]) 10:43, 12 November 2016 (CET) Ah! ho appena trovato una soluzione che prevede 2 soli token in pi&amp;amp;ugrave;! [[User:Renzo|Renzo]] ([[User talk:Renzo|talk]]) 10:47, 12 November 2016 (CET)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=C&amp;gt;&lt;br /&gt;
#include&amp;lt;stdio.h&amp;gt;&lt;br /&gt;
#include&amp;lt;stdint.h&amp;gt;&lt;br /&gt;
#include&amp;lt;pthread.h&amp;gt;&lt;br /&gt;
#include&amp;lt;semaphore.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#define NUMBER_OF_READERS 3&lt;br /&gt;
#define NUMBER_OF_WRITERS 3&lt;br /&gt;
semaphore mutex;&lt;br /&gt;
semaphore ok2read;&lt;br /&gt;
semaphore ok2write;&lt;br /&gt;
&lt;br /&gt;
int numberOfReaders=0;&lt;br /&gt;
int numberOfWriters=0;&lt;br /&gt;
int waitingReaders=0;&lt;br /&gt;
int waitingWriters=0;&lt;br /&gt;
&lt;br /&gt;
// (nw == 0 &amp;amp;&amp;amp; nr == 0) || (nr &amp;gt; 0 &amp;amp;&amp;amp; nw == 0) || nw == 1&lt;br /&gt;
// (nw == 0 &amp;amp;&amp;amp; nr &amp;gt;= 0) || nw == 1&lt;br /&gt;
&lt;br /&gt;
void startread(void) {&lt;br /&gt;
// &amp;lt;await nw == 0 -&amp;gt; nr++&amp;gt;&lt;br /&gt;
    semaphore_P(mutex);&lt;br /&gt;
    if (numberOfWriters &amp;gt; 0) {&lt;br /&gt;
        waitingReaders++;&lt;br /&gt;
        semaphore_V(mutex);&lt;br /&gt;
        semaphore_P(ok2read);&lt;br /&gt;
        waitingReaders--;&lt;br /&gt;
    }&lt;br /&gt;
    numberOfReaders++;&lt;br /&gt;
    printf(&amp;quot;NR %d - NW %d - WR %d - WW %d \n&amp;quot;, numberOfReaders, numberOfWriters, waitingReaders, waitingWriters);&lt;br /&gt;
    if (waitingReaders &amp;gt; 0 )&lt;br /&gt;
        semaphore_V(ok2read);&lt;br /&gt;
    else&lt;br /&gt;
        semaphore_V(mutex);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void endread(void) {&lt;br /&gt;
// &amp;lt;nr--&amp;gt;&lt;br /&gt;
    semaphore_P(mutex);&lt;br /&gt;
    numberOfReaders--;&lt;br /&gt;
    printf(&amp;quot;NR %d - NW %d - WR %d - WW %d \n&amp;quot;, numberOfReaders, numberOfWriters, waitingReaders, waitingWriters);&lt;br /&gt;
    if (numberOfReaders == 0 &amp;amp;&amp;amp; waitingWriters &amp;gt; 0)&lt;br /&gt;
        semaphore_V(ok2write);&lt;br /&gt;
    else&lt;br /&gt;
        semaphore_V(mutex);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void startwrite(void) {&lt;br /&gt;
// &amp;lt;await nw == 0 &amp;amp;&amp;amp; nr == 0 -&amp;gt; nw++&amp;gt;&lt;br /&gt;
    semaphore_P(mutex);&lt;br /&gt;
    if (numberOfWriters &amp;gt; 0 || numberOfReaders &amp;gt; 0) {&lt;br /&gt;
        waitingWriters++;&lt;br /&gt;
        semaphore_V(mutex);&lt;br /&gt;
        semaphore_P(ok2write);&lt;br /&gt;
        waitingWriters--;&lt;br /&gt;
    }&lt;br /&gt;
    numberOfWriters++;&lt;br /&gt;
    printf(&amp;quot;NR %d - NW %d - WR %d - WW %d \n&amp;quot;, numberOfReaders, numberOfWriters, waitingReaders, waitingWriters);&lt;br /&gt;
    semaphore_V(mutex);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void endwrite(void) {&lt;br /&gt;
// &amp;lt;nw--&amp;gt;&lt;br /&gt;
    semaphore_P(mutex);&lt;br /&gt;
    numberOfWriters--;&lt;br /&gt;
    printf(&amp;quot;NR %d - NW %d - WR %d - WW %d \n&amp;quot;, numberOfReaders, numberOfWriters, waitingReaders, waitingWriters);&lt;br /&gt;
    if (waitingReaders &amp;gt; 0)&lt;br /&gt;
        semaphore_V(ok2read);&lt;br /&gt;
    else if (waitingWriters &amp;gt; 0)&lt;br /&gt;
        semaphore_V(ok2write);&lt;br /&gt;
    else&lt;br /&gt;
        semaphore_V(mutex);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void *reader(void *arg) {&lt;br /&gt;
    int i = (uintptr_t)arg;&lt;br /&gt;
    while (1) {&lt;br /&gt;
        //other code&lt;br /&gt;
        usleep(random() % 200000);&lt;br /&gt;
        startread();&lt;br /&gt;
        //read&lt;br /&gt;
        usleep(random() % 200000);&lt;br /&gt;
        endread();&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void *writer(void *arg) {&lt;br /&gt;
    int i = (uintptr_t)arg;&lt;br /&gt;
    while (1) {&lt;br /&gt;
        //other code&lt;br /&gt;
        usleep(random() % 200000);&lt;br /&gt;
        startwrite();&lt;br /&gt;
        //write&lt;br /&gt;
        usleep(random() % 200000);&lt;br /&gt;
        endwrite();&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
//printf(&amp;quot;philo thinking: %d\n&amp;quot;,i);&lt;br /&gt;
/*while*/&lt;br /&gt;
&lt;br /&gt;
int main(int argc, char *argv[]) {&lt;br /&gt;
    int i;&lt;br /&gt;
    pthread_t t;&lt;br /&gt;
    srandom(time(NULL));&lt;br /&gt;
    mutex=semaphore_create(1);&lt;br /&gt;
    ok2read=semaphore_create(0);&lt;br /&gt;
    ok2write=semaphore_create(0);&lt;br /&gt;
    for (i=0; i&amp;lt;NUMBER_OF_READERS; i++)&lt;br /&gt;
        pthread_create(&amp;amp;t, NULL, reader, (void *)(uintptr_t) i);&lt;br /&gt;
    for (i=0; i&amp;lt;NUMBER_OF_WRITERS; i++)&lt;br /&gt;
        pthread_create(&amp;amp;t, NULL, writer, (void *)(uintptr_t) i);&lt;br /&gt;
    while(1)&lt;br /&gt;
        pause();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== RW2 ==&lt;br /&gt;
Buongiorno, guardando il codice visto a lezione mi sembra che cambiando la condizione del primo if nella startread() da &amp;quot;if (nw &amp;gt; 0 &amp;amp;&amp;amp; ww == 0)&amp;quot; a &amp;quot;if (nw &amp;gt; 0 || ww &amp;gt; 0)&amp;quot; la situazione migliori. In particolare con l'and tra quelle due condizioni si aveva che non veniva fatta la P sull'ok2read anche quando si aveva nw&amp;gt;0 (con ww!=0), cosa che invece dovrebbe fare. Lasciando il resto del codice uguale mi sembra che faccia quello che deve fare.. .&lt;/div&gt;</summary>
		<author><name>Matteo.pincherle</name></author>
	</entry>
	<entry>
		<id>https://so.v2.cs.unibo.it/wiki/index.php?title=Zibaldone&amp;diff=1579</id>
		<title>Zibaldone</title>
		<link rel="alternate" type="text/html" href="https://so.v2.cs.unibo.it/wiki/index.php?title=Zibaldone&amp;diff=1579"/>
		<updated>2016-11-12T14:46:38Z</updated>

		<summary type="html">&lt;p&gt;Matteo.pincherle: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== RW errato ==&lt;br /&gt;
Codice '''ERRATO''' dei lettori scrittori che dovrebbe non soffrire di problemi di starvation...&lt;br /&gt;
Esercizio: trovare gli errori.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=C&amp;gt;&lt;br /&gt;
#include&amp;lt;stdio.h&amp;gt;&lt;br /&gt;
#include&amp;lt;stdint.h&amp;gt;&lt;br /&gt;
#include&amp;lt;pthread.h&amp;gt;&lt;br /&gt;
#include&amp;lt;semaphore.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#define NREADER 3&lt;br /&gt;
#define NWRITER 3&lt;br /&gt;
semaphore mutex;&lt;br /&gt;
semaphore ok2read;&lt;br /&gt;
semaphore ok2write;&lt;br /&gt;
&lt;br /&gt;
int nr=0;&lt;br /&gt;
int nw=0;&lt;br /&gt;
int wr=0;&lt;br /&gt;
int ww=0;&lt;br /&gt;
int w_last;&lt;br /&gt;
&lt;br /&gt;
// (nw == 0 &amp;amp;&amp;amp; nr == 0) || (nr &amp;gt; 0 &amp;amp;&amp;amp; nw == 0) || nw == 1&lt;br /&gt;
// (nw == 0 &amp;amp;&amp;amp; nr &amp;gt;= 0) || nw == 1&lt;br /&gt;
&lt;br /&gt;
// this &amp;quot;baton&amp;quot; function has been left for reference only.&lt;br /&gt;
// code to implement &amp;quot;passing the baton&amp;quot; has been copied at the end of&lt;br /&gt;
// each ({start}|{end})({read}|{write}) function and reduced.&lt;br /&gt;
void baton(void) {&lt;br /&gt;
        if (nw == 0 &amp;amp;&amp;amp; nr == 0 &amp;amp;&amp;amp; ww &amp;gt; 0)&lt;br /&gt;
                semaphore_V(ok2write);&lt;br /&gt;
        else if (nw == 0 &amp;amp;&amp;amp; wr &amp;gt; 0 )&lt;br /&gt;
                semaphore_V(ok2read);&lt;br /&gt;
        else&lt;br /&gt;
                semaphore_V(mutex);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void startread(void) {&lt;br /&gt;
// &amp;lt;await nw == 0 -&amp;gt; nr++&amp;gt;&lt;br /&gt;
        semaphore_P(mutex);&lt;br /&gt;
        if (nw &amp;gt; 0 &amp;amp;&amp;amp; ww == 0) {&lt;br /&gt;
                wr++;&lt;br /&gt;
                semaphore_V(mutex);&lt;br /&gt;
                semaphore_P(ok2read);&lt;br /&gt;
                wr--;&lt;br /&gt;
        }&lt;br /&gt;
        nr++;&lt;br /&gt;
        w_last=0;&lt;br /&gt;
        printf(&amp;quot;NR %d - NW %d - WR %d - WW %d \n&amp;quot;, nr, nw, wr, ww);&lt;br /&gt;
        if (wr &amp;gt; 0 )&lt;br /&gt;
                semaphore_V(ok2read);&lt;br /&gt;
        else&lt;br /&gt;
                semaphore_V(mutex);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void endread(void) {&lt;br /&gt;
// &amp;lt;nr--&amp;gt;&lt;br /&gt;
        semaphore_P(mutex);&lt;br /&gt;
        nr--;&lt;br /&gt;
        printf(&amp;quot;NR %d - NW %d - WR %d - WW %d \n&amp;quot;, nr, nw, wr, ww);&lt;br /&gt;
        if (nr == 0 &amp;amp;&amp;amp; ww &amp;gt; 0)&lt;br /&gt;
                semaphore_V(ok2write);&lt;br /&gt;
        else&lt;br /&gt;
                semaphore_V(mutex);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void startwrite(void) {&lt;br /&gt;
// &amp;lt;await nw == 0 &amp;amp;&amp;amp; nr == 0 -&amp;gt; nw++&amp;gt;&lt;br /&gt;
        semaphore_P(mutex);&lt;br /&gt;
        if (nw &amp;gt; 0 || nr &amp;gt; 0) {&lt;br /&gt;
                ww++;&lt;br /&gt;
                semaphore_V(mutex);&lt;br /&gt;
                semaphore_P(ok2write);&lt;br /&gt;
                ww--;&lt;br /&gt;
        }&lt;br /&gt;
        nw++;&lt;br /&gt;
        w_last=1;&lt;br /&gt;
        printf(&amp;quot;NR %d - NW %d - WR %d - WW %d \n&amp;quot;, nr, nw, wr, ww);&lt;br /&gt;
        semaphore_V(mutex);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void endwrite(void) {&lt;br /&gt;
// &amp;lt;nw--&amp;gt;&lt;br /&gt;
        semaphore_P(mutex);&lt;br /&gt;
        nw--;&lt;br /&gt;
        printf(&amp;quot;NR %d - NW %d - WR %d - WW %d \n&amp;quot;, nr, nw, wr, ww);&lt;br /&gt;
        if (wr &amp;gt; 0 &amp;amp;&amp;amp; (ww == 0 || w_last))&lt;br /&gt;
                semaphore_V(ok2read);&lt;br /&gt;
        else if (ww &amp;gt; 0 &amp;amp;&amp;amp; (wr == 0 || !w_last))&lt;br /&gt;
                semaphore_V(ok2write);&lt;br /&gt;
        else&lt;br /&gt;
                semaphore_V(mutex);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void *reader(void *arg) {&lt;br /&gt;
        int i = (uintptr_t)arg;&lt;br /&gt;
        while (1) {&lt;br /&gt;
                //other code&lt;br /&gt;
                usleep(random() % 200000);&lt;br /&gt;
                startread();&lt;br /&gt;
                //read&lt;br /&gt;
                usleep(random() % 200000);&lt;br /&gt;
                endread();&lt;br /&gt;
        }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void *writer(void *arg) {&lt;br /&gt;
        int i = (uintptr_t)arg;&lt;br /&gt;
        while (1) {&lt;br /&gt;
                //other code&lt;br /&gt;
                usleep(random() % 200000);&lt;br /&gt;
                startwrite();&lt;br /&gt;
                //write&lt;br /&gt;
                usleep(random() % 200000);&lt;br /&gt;
                endwrite();&lt;br /&gt;
        }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
//printf(&amp;quot;philo thinking: %d\n&amp;quot;,i);&lt;br /&gt;
/*while*/&lt;br /&gt;
&lt;br /&gt;
int main(int argc, char *argv[]) {&lt;br /&gt;
        int i;&lt;br /&gt;
        pthread_t t;&lt;br /&gt;
        srandom(time(NULL));&lt;br /&gt;
        mutex=semaphore_create(1);&lt;br /&gt;
        ok2read=semaphore_create(0);&lt;br /&gt;
        ok2write=semaphore_create(0);&lt;br /&gt;
        for (i=0; i&amp;lt;NREADER; i++)&lt;br /&gt;
                pthread_create(&amp;amp;t, NULL, reader, (void *)(uintptr_t) i);&lt;br /&gt;
        for (i=0; i&amp;lt;NWRITER; i++)&lt;br /&gt;
                pthread_create(&amp;amp;t, NULL, writer, (void *)(uintptr_t) i);&lt;br /&gt;
        while(1)&lt;br /&gt;
                pause();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== RW di FedericoB ==&lt;br /&gt;
Propongo la seguente soluzione. Mi sembra che funzioni ma devo ancora capire perchè e documentarla bene. Ho provato prima a cercare il bug ma non ci sono riuscito. Ho quindi modificato il codice secondo ciò che mi sembrava sensato in base alle condizioni del problema. Ne possiamo parlare in aula oggi. --[[User:FedericoB|FedericoB]] ([[User talk:FedericoB|talk]]) 12:48, 11 November 2016 (CET)&lt;br /&gt;
Ho notato che l'errore non si manifesta più eliminando il controllo che ci siano scrittori in attesa quando un lettore vuole iniziare a scrivere. Non capisco come questo possa essere collegato al bug. --[[User:FedericoB|FedericoB]] ([[User talk:FedericoB|talk]]) 15:10, 11 November 2016 (CET)&lt;br /&gt;
&lt;br /&gt;
FedericoB, questa soluzione &amp;amp;egrave; quella con priorit&amp;amp;agrave; ai lettori, no? Se continuano ad arrivare lettori numberOfReaders non sar&amp;amp;agrave; mai zero e quindi gli scrittori non scriveranno mai. [[User:Renzo|Renzo]] ([[User talk:Renzo|talk]]) 10:34, 12 November 2016 (CET)&lt;br /&gt;
&lt;br /&gt;
SFIDA: ho trovato il modo di togliere la starvation aggiungendo 4 token (parole chiave, nomi di variabili, operatori, costanti) a questa soluzione di FedericoB. Chi trova la soluzione? [[User:Renzo|Renzo]] ([[User talk:Renzo|talk]]) 10:43, 12 November 2016 (CET) Ah! ho appena trovato una soluzione che prevede 2 soli token in pi&amp;amp;ugrave;! [[User:Renzo|Renzo]] ([[User talk:Renzo|talk]]) 10:47, 12 November 2016 (CET)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=C&amp;gt;&lt;br /&gt;
#include&amp;lt;stdio.h&amp;gt;&lt;br /&gt;
#include&amp;lt;stdint.h&amp;gt;&lt;br /&gt;
#include&amp;lt;pthread.h&amp;gt;&lt;br /&gt;
#include&amp;lt;semaphore.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#define NUMBER_OF_READERS 3&lt;br /&gt;
#define NUMBER_OF_WRITERS 3&lt;br /&gt;
semaphore mutex;&lt;br /&gt;
semaphore ok2read;&lt;br /&gt;
semaphore ok2write;&lt;br /&gt;
&lt;br /&gt;
int numberOfReaders=0;&lt;br /&gt;
int numberOfWriters=0;&lt;br /&gt;
int waitingReaders=0;&lt;br /&gt;
int waitingWriters=0;&lt;br /&gt;
&lt;br /&gt;
// (nw == 0 &amp;amp;&amp;amp; nr == 0) || (nr &amp;gt; 0 &amp;amp;&amp;amp; nw == 0) || nw == 1&lt;br /&gt;
// (nw == 0 &amp;amp;&amp;amp; nr &amp;gt;= 0) || nw == 1&lt;br /&gt;
&lt;br /&gt;
void startread(void) {&lt;br /&gt;
// &amp;lt;await nw == 0 -&amp;gt; nr++&amp;gt;&lt;br /&gt;
    semaphore_P(mutex);&lt;br /&gt;
    if (numberOfWriters &amp;gt; 0) {&lt;br /&gt;
        waitingReaders++;&lt;br /&gt;
        semaphore_V(mutex);&lt;br /&gt;
        semaphore_P(ok2read);&lt;br /&gt;
        waitingReaders--;&lt;br /&gt;
    }&lt;br /&gt;
    numberOfReaders++;&lt;br /&gt;
    printf(&amp;quot;NR %d - NW %d - WR %d - WW %d \n&amp;quot;, numberOfReaders, numberOfWriters, waitingReaders, waitingWriters);&lt;br /&gt;
    if (waitingReaders &amp;gt; 0 )&lt;br /&gt;
        semaphore_V(ok2read);&lt;br /&gt;
    else&lt;br /&gt;
        semaphore_V(mutex);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void endread(void) {&lt;br /&gt;
// &amp;lt;nr--&amp;gt;&lt;br /&gt;
    semaphore_P(mutex);&lt;br /&gt;
    numberOfReaders--;&lt;br /&gt;
    printf(&amp;quot;NR %d - NW %d - WR %d - WW %d \n&amp;quot;, numberOfReaders, numberOfWriters, waitingReaders, waitingWriters);&lt;br /&gt;
    if (numberOfReaders == 0 &amp;amp;&amp;amp; waitingWriters &amp;gt; 0)&lt;br /&gt;
        semaphore_V(ok2write);&lt;br /&gt;
    else&lt;br /&gt;
        semaphore_V(mutex);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void startwrite(void) {&lt;br /&gt;
// &amp;lt;await nw == 0 &amp;amp;&amp;amp; nr == 0 -&amp;gt; nw++&amp;gt;&lt;br /&gt;
    semaphore_P(mutex);&lt;br /&gt;
    if (numberOfWriters &amp;gt; 0 || numberOfReaders &amp;gt; 0) {&lt;br /&gt;
        waitingWriters++;&lt;br /&gt;
        semaphore_V(mutex);&lt;br /&gt;
        semaphore_P(ok2write);&lt;br /&gt;
        waitingWriters--;&lt;br /&gt;
    }&lt;br /&gt;
    numberOfWriters++;&lt;br /&gt;
    printf(&amp;quot;NR %d - NW %d - WR %d - WW %d \n&amp;quot;, numberOfReaders, numberOfWriters, waitingReaders, waitingWriters);&lt;br /&gt;
    semaphore_V(mutex);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void endwrite(void) {&lt;br /&gt;
// &amp;lt;nw--&amp;gt;&lt;br /&gt;
    semaphore_P(mutex);&lt;br /&gt;
    numberOfWriters--;&lt;br /&gt;
    printf(&amp;quot;NR %d - NW %d - WR %d - WW %d \n&amp;quot;, numberOfReaders, numberOfWriters, waitingReaders, waitingWriters);&lt;br /&gt;
    if (waitingReaders &amp;gt; 0)&lt;br /&gt;
        semaphore_V(ok2read);&lt;br /&gt;
    else if (waitingWriters &amp;gt; 0)&lt;br /&gt;
        semaphore_V(ok2write);&lt;br /&gt;
    else&lt;br /&gt;
        semaphore_V(mutex);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void *reader(void *arg) {&lt;br /&gt;
    int i = (uintptr_t)arg;&lt;br /&gt;
    while (1) {&lt;br /&gt;
        //other code&lt;br /&gt;
        usleep(random() % 200000);&lt;br /&gt;
        startread();&lt;br /&gt;
        //read&lt;br /&gt;
        usleep(random() % 200000);&lt;br /&gt;
        endread();&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void *writer(void *arg) {&lt;br /&gt;
    int i = (uintptr_t)arg;&lt;br /&gt;
    while (1) {&lt;br /&gt;
        //other code&lt;br /&gt;
        usleep(random() % 200000);&lt;br /&gt;
        startwrite();&lt;br /&gt;
        //write&lt;br /&gt;
        usleep(random() % 200000);&lt;br /&gt;
        endwrite();&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
//printf(&amp;quot;philo thinking: %d\n&amp;quot;,i);&lt;br /&gt;
/*while*/&lt;br /&gt;
&lt;br /&gt;
int main(int argc, char *argv[]) {&lt;br /&gt;
    int i;&lt;br /&gt;
    pthread_t t;&lt;br /&gt;
    srandom(time(NULL));&lt;br /&gt;
    mutex=semaphore_create(1);&lt;br /&gt;
    ok2read=semaphore_create(0);&lt;br /&gt;
    ok2write=semaphore_create(0);&lt;br /&gt;
    for (i=0; i&amp;lt;NUMBER_OF_READERS; i++)&lt;br /&gt;
        pthread_create(&amp;amp;t, NULL, reader, (void *)(uintptr_t) i);&lt;br /&gt;
    for (i=0; i&amp;lt;NUMBER_OF_WRITERS; i++)&lt;br /&gt;
        pthread_create(&amp;amp;t, NULL, writer, (void *)(uintptr_t) i);&lt;br /&gt;
    while(1)&lt;br /&gt;
        pause();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== RW2 ==&lt;br /&gt;
Buongiorno, guardando il codice visto a lezione mi sembra che cambiando la condizione del primo if nella startread() da &amp;quot;if (nw &amp;gt; 0 &amp;amp;&amp;amp; ww == 0)&amp;quot; a &amp;quot;if (nw &amp;gt; 0 || ww &amp;gt; 0)&amp;quot; la situazione migliori. In particolare con l'and tra quelle due condizioni si aveva che non veniva fatta la P sull'ok2read anche quando si aveva nw&amp;gt;0 (con ww!=0), cosa che invece dovrebbe fare. Lasciando il resto del codice uguale mi sembra che faccia quello che deve fare...&lt;/div&gt;</summary>
		<author><name>Matteo.pincherle</name></author>
	</entry>
</feed>