Multithreading Example using POSIX Threads

Requirements : GCC Compiler and any Linux OS with pthread Library

Explanation:

There are two threads in the following program which are implemented using function pointers, in which one thread is helpful for getting a input from the keyboard and other thread is helpful to convert it to upper case letters. But here both the threads does not depends on each other.

 That is, the second thread automatically converts the string to upper case letters itself, does not bothering about the first thread(the string entered through the keyboard). Two seconds delay is given to enter the string via the key board.

Program:

 

#include <stdio.h>

#include <unistd.h>

#include <stdlib.h>

#include <string.h>

#include <ctype.h>

#include <pthread.h>

#define BUFFER_SIZE 1024

char buffer[BUFFER_SIZE];

void *read_thread(void *arg)

{

while(strncmp("stop", buffer,4) !=0)

{

printf("enter text:");

fgets(buffer,BUFFER_SIZE, stdin);

sleep(2);

}

pthread_exit("Read thread exit successful");

}

void *convert_thread()

{

int i;

while(strncmp("stop",buffer,4)!=0)

{

sleep(3);

printf("Converted text:");

for(i=0;i<strlen(buffer);i++)

printf("%c",toupper(buffer[i]));

}

pthread_exit("Convert_thread exit successful");

}

int main()

{

int result;

pthread_t rthread, cthread;

void *thread_result;

printf("enter text, the program will convert it into upper case, to stop enter 'stop'\n");

result=pthread_create(&rthread, NULL, read_thread, NULL);

if(result != 0)

{

printf("Read_thread creation failed");

exit(1);

}

result=pthread_create(&cthread, NULL, convert_thread, NULL);

if(result != 0)

{

printf("Cpnvert_thread creation failed");

exit(1);

}

result=pthread_join(rthread, &thread_result);

if(result != 0)

{

printf("read_thread join failed");

exit(1);

}

printf("read_thread joined, %s\n", thread_result);

result=pthread_join(cthread, &thread_result);

if(result !=0)

{

printf("convert_thread join failed");

exit(1);

}

printf("convert_thread joined, %s\n", thread_result);

exit(0);

return 0;

}

Conclusion:

In this program, one thread reads the input and another thread converts the input string into upper case letters. This is repeated till 'stop' typed.

The prorgam can be compiled by

$ gcc -o multithread multithread.c -lpthread

After observing the output the lack of coordination between the two threads is evident. Even if the input is not given from the keyboard, the thread does the conversion to upper case letter. So to avoid that, it is necessary to use semaphores.

Comments

Popular Posts