The following piece of code is characterized by implementing a problem of reader-writer type: the (thread) reader reads data from the keyboard and stores them in a position. This position is read later when the (thread) writer writes to a memory location. The problem needs both threads are blocked; the writer must wait for the memory location is free, not underfoot; and the second thread needs to have something to print. This is the solution of the problem:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 | /* compile with gcc -pthread *.c -o ./prod_consumer */ #include <stdio.h> #include <pthread.h> #include <stdlib.h> #define TRUE 1 #define FALSE 0 char shared_array[204]; pthread_mutex_t lock= PTHREAD_MUTEX_INITIALIZER; int string_read=FALSE; pthread_cond_t cond= PTHREAD_COND_INITIALIZER;; pthread_cond_t cond2= PTHREAD_COND_INITIALIZER;; //Reader thread void * read1() { while(TRUE) { pthread_mutex_lock(&lock); while(string_read) { pthread_cond_wait(&cond2,&lock); } printf("\n[TH1] Enter a string (100 characters): "); scanf("%100s",shared_array); //unsafe with more than 204 characters string_read=TRUE; pthread_cond_signal(&cond); pthread_mutex_unlock(&lock); } } //Writer thread void * write1() { while(TRUE) { pthread_mutex_lock(&lock); while(!string_read) { pthread_cond_wait(&cond,&lock); } printf("\n[TH2]The string entered is: \"%s\"\n",shared_array); string_read=FALSE; pthread_cond_signal(&cond2); pthread_mutex_unlock(&lock); } } int main() { int status; pthread_t tr; pthread_t tw; pthread_create(&tr,NULL,read1,NULL); pthread_create(&tw,NULL,write1,NULL); pthread_join(tr,NULL); pthread_join(tw,NULL); return 0; } |
Some aspects of the problem:
The solution uses a global lock lock
to protect all access to shared information.
It uses two variable conditions (cond, cond2
) so that each thread can safely sleep with a
wait
operation.
A thread notifies another when it has completed about your condition corresponding variable.
Using the previous example, you are required to perform de following actions:
Download the code, compile it, and run the resulting application.
Modify the code to read the scanf
without lock
taken.
Hint: Divide the protected section into two blocks after reading the variables.
Modify the code to replace the blocking waits for another active (with a sleep
of a second).
Which of the two solutions is more elegant: the sleep
s, or using condition variables?