Note that there are some explanatory texts on larger screens.

plurals
  1. POQuestion about semaphore
    text
    copied!<p>Given the following code, can you figure out what caused "You input 7 characters" showed up 3 times especially the last time?</p> <pre><code>#include &lt;stdio.h&gt; #include &lt;unistd.h&gt; #include &lt;stdlib.h&gt; #include &lt;string.h&gt; #include &lt;pthread.h&gt; #include &lt;semaphore.h&gt; void *thread_function(void *arg); sem_t bin_sem; #define WORK_SIZE 1024 char work_area[WORK_SIZE]; int main(){ int res; pthread_t a_thread; void *thread_result; res = sem_init(&amp;bin_sem,0,0); if (res!=0){ perror("Semaphore initialization failed"); exit(EXIT_FAILURE); } res = pthread_create(&amp;a_thread,NULL,thread_function,NULL); if (res!=0){ perror("Thread creation failed"); exit(EXIT_FAILURE); } printf("Input some text. Enter ‘end’ to finish"); while (strncmp("end",work_area,3)!=0){ if(strncmp(work_area,"FAST",4)==0){ sem_post(&amp;bin_sem); strcpy(work_area,"Wheeee..."); }else{ fgets(work_area,WORK_SIZE,stdin); } sem_post(&amp;bin_sem); } printf("\nWaiting for thread to finish\n"); res = pthread_join(a_thread,&amp;thread_result); if(res!=0){ perror("Thread join failed!"); exit(EXIT_FAILURE); } printf("Thread joined\n"); sem_destroy(&amp;bin_sem); exit(EXIT_SUCCESS); } void *thread_function(void* arg){ sem_wait(&amp;bin_sem); while(strncmp("end",work_area,3)!=0){ printf("You input %d characters\n",strlen(work_area-1)); sem_wait(&amp;bin_sem); } pthread_exit(NULL); } </code></pre> <p>Test input/output:</p> <pre><code>$ cc -D_REENTRANT thread3a.c -o thread3a -lpthread $ ./thread3a Input some text. Enter ‘end’ to finish Excession You input 9 characters FAST You input 7 characters You input 7 characters You input 7 characters end Waiting for thread to finish... Thread joined </code></pre>
 

Querying!

 
Guidance

SQuiL has stopped working due to an internal error.

If you are curious you may find further information in the browser console, which is accessible through the devtools (F12).

Reload