Threads Completed
This commit is contained in:
		
							parent
							
								
									5f81932a32
								
							
						
					
					
						commit
						c30932de97
					
				
										
											Binary file not shown.
										
									
								
							| 
						 | 
					@ -0,0 +1,247 @@
 | 
				
			||||||
 | 
					#include <stdio.h>
 | 
				
			||||||
 | 
					#include <stdlib.h>
 | 
				
			||||||
 | 
					#include <math.h>
 | 
				
			||||||
 | 
					#include <cstdint>
 | 
				
			||||||
 | 
					#include "important.h"
 | 
				
			||||||
 | 
					#include <pthread.h>
 | 
				
			||||||
 | 
					#include <iostream>
 | 
				
			||||||
 | 
					#include <chrono>
 | 
				
			||||||
 | 
					#include <fstream>
 | 
				
			||||||
 | 
					#include <string.h>
 | 
				
			||||||
 | 
					#include <sys/types.h>
 | 
				
			||||||
 | 
					#include <sys/wait.h>
 | 
				
			||||||
 | 
					#include <unistd.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					using namespace std;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					int current_index = 0;
 | 
				
			||||||
 | 
					int sum;
 | 
				
			||||||
 | 
					struct image_t* input_image;
 | 
				
			||||||
 | 
					struct image_t* smoother;
 | 
				
			||||||
 | 
					struct image_t* details;
 | 
				
			||||||
 | 
					struct image_t* sharp;
 | 
				
			||||||
 | 
					int a = 1;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					int lock1 = 0; // initial lock set
 | 
				
			||||||
 | 
					int lock2 = 1; // initial lock set
 | 
				
			||||||
 | 
					int lock3 = 0; // initial lock set
 | 
				
			||||||
 | 
					int lock4 = 1; // initial lock set
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					int pt = 1;
 | 
				
			||||||
 | 
					int pt1 = 1;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void* S1_smoothen(void* thread_number)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    int my_number = *(int *)thread_number;
 | 
				
			||||||
 | 
						//cout << input_image->width << input_image->height << " " <<  input_image->image_pixels << endl;
 | 
				
			||||||
 | 
						int width = input_image->width;
 | 
				
			||||||
 | 
						int height = input_image->height;
 | 
				
			||||||
 | 
						
 | 
				
			||||||
 | 
						// memory allocation
 | 
				
			||||||
 | 
						// struct image_t* smoother = new struct image_t;
 | 
				
			||||||
 | 
					    for(pt = 1; pt <= 1000; ++pt) {
 | 
				
			||||||
 | 
					        while(__sync_lock_test_and_set(&lock1,1));
 | 
				
			||||||
 | 
					        printf("thread number : %d\tindex : %d\n", my_number, pt);
 | 
				
			||||||
 | 
					        for(int i = 1; i < height-1; i++)
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            for(int j = 1; j < width-1; j++)
 | 
				
			||||||
 | 
					            {
 | 
				
			||||||
 | 
					                for(int k = 0; k < 3; k++)
 | 
				
			||||||
 | 
					                {
 | 
				
			||||||
 | 
					                    //image->image_pixels[i][j][k] = val;
 | 
				
			||||||
 | 
					                    // edge cases
 | 
				
			||||||
 | 
					                    if(i == 0 && j == 0) { // i-1 and j - 1 doesnt exist
 | 
				
			||||||
 | 
					                        smoother->image_pixels[i][j][k] =  ( input_image->image_pixels[i][j][k] / 9+  input_image->image_pixels[i][j+1][k] / 9 +  input_image->image_pixels[i+1][j][k] / 9 +  input_image->image_pixels[i+1][j+1][k] / 9);
 | 
				
			||||||
 | 
					                        
 | 
				
			||||||
 | 
					                    }
 | 
				
			||||||
 | 
					                    else if(i == height - 1 && j == 0) { // i+1 and j-1 does not exist
 | 
				
			||||||
 | 
					                        smoother->image_pixels[i][j][k] = ( input_image->image_pixels[i-1][j][k] / 9 +  input_image->image_pixels[i-1][j+1][k] / 9+  input_image->image_pixels[i][j][k] / 9+  input_image->image_pixels[i][j+1][k] / 9);
 | 
				
			||||||
 | 
					                    }
 | 
				
			||||||
 | 
					                    
 | 
				
			||||||
 | 
					                    else if(i == 0 && j == width - 1) { // i-1 and j+1 does not exist
 | 
				
			||||||
 | 
					                        smoother->image_pixels[i][j][k] = ( input_image->image_pixels[i][j-1][k] / 9 +  input_image->image_pixels[i][j][k] / 9+   input_image->image_pixels[i+1][j-1][k] / 9 +  input_image->image_pixels[i+1][j][k] / 9);
 | 
				
			||||||
 | 
					                    }
 | 
				
			||||||
 | 
					                    else if(i == height - 1 && j == width - 1) { // i+1 and j+1 does not exist
 | 
				
			||||||
 | 
					                        smoother->image_pixels[i][j][k] = ( input_image->image_pixels[i-1][j-1][k] / 9 +  input_image->image_pixels[i-1][j][k] / 9 +  input_image->image_pixels[i][j-1][k] / 9 +  input_image->image_pixels[i][j][k] / 9);
 | 
				
			||||||
 | 
					                    }
 | 
				
			||||||
 | 
					                    else if (i == 0) {  // i - 1 does not exist
 | 
				
			||||||
 | 
					                            smoother->image_pixels[i][j][k] = ( input_image->image_pixels[i][j-1][k] / 9 +  input_image->image_pixels[i][j][k] / 9+  input_image->image_pixels[i][j+1][k] / 9+  input_image->image_pixels[i+1][j-1][k] / 9+  input_image->image_pixels[i+1][j][k] / 9+  input_image->image_pixels[i+1][j+1][k] / 9);
 | 
				
			||||||
 | 
					                        }
 | 
				
			||||||
 | 
					                    
 | 
				
			||||||
 | 
					                    else if(j == 0) { // j -1 does not exist
 | 
				
			||||||
 | 
					                        smoother->image_pixels[i][j][k] = ( input_image->image_pixels[i-1][j][k] / 9+  input_image->image_pixels[i-1][j+1][k]  / 9+  input_image->image_pixels[i][j][k] / 9+  input_image->image_pixels[i][j+1][k] / 9+   input_image->image_pixels[i+1][j][k] / 9+  input_image->image_pixels[i+1][j+1][k]/ 9);
 | 
				
			||||||
 | 
					                    }
 | 
				
			||||||
 | 
					                    
 | 
				
			||||||
 | 
					                    else if(i == height - 1) { // i+1 does not exist
 | 
				
			||||||
 | 
					                        smoother->image_pixels[i][j][k] = ( input_image->image_pixels[i-1][j-1][k] / 9+  input_image->image_pixels[i-1][j][k] / 9+  input_image->image_pixels[i-1][j+1][k] / 9+  input_image->image_pixels[i][j-1][k] / 9+  input_image->image_pixels[i][j][k] / 9+  input_image->image_pixels[i][j+1][k]/ 9);
 | 
				
			||||||
 | 
					                    }		
 | 
				
			||||||
 | 
					                    else if(j == width - 1) { // j + 1 does not exist
 | 
				
			||||||
 | 
					                        smoother->image_pixels[i][j][k] = ( input_image->image_pixels[i-1][j-1][k] / 9+  input_image->image_pixels[i-1][j][k] / 9+  input_image->image_pixels[i][j-1][k] / 9+  input_image->image_pixels[i][j][k]/ 9 +   input_image->image_pixels[i+1][j-1][k] / 9+  input_image->image_pixels[i+1][j][k] / 9);
 | 
				
			||||||
 | 
					                    }	
 | 
				
			||||||
 | 
					                    else {
 | 
				
			||||||
 | 
					                    smoother->image_pixels[i][j][k] = ( input_image->image_pixels[i-1][j-1][k] / 9 +  input_image->image_pixels[i-1][j][k] / 9 +  input_image->image_pixels[i-1][j+1][k]/9 +  input_image->image_pixels[i][j-1][k]/9 +  input_image->image_pixels[i][j][k] / 9 +  input_image->image_pixels[i][j+1][k] / 9 +  input_image->image_pixels[i+1][j-1][k] / 9 +  input_image->image_pixels[i+1][j][k] / 9 +  input_image->image_pixels[i+1][j+1][k] / 9);
 | 
				
			||||||
 | 
					                    
 | 
				
			||||||
 | 
					                    }
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        __sync_lock_release(&lock2);	
 | 
				
			||||||
 | 
					        __sync_lock_release(&lock1);	
 | 
				
			||||||
 | 
					        
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
						return nullptr;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// atomic_flag lock_stream2 = ATOMIC_FLAG_INIT; // initial lock set
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void* S2_find_details(void *thread_number)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    int my_number = *(int *)thread_number;
 | 
				
			||||||
 | 
						int width = input_image->width;
 | 
				
			||||||
 | 
						int height = input_image->height;
 | 
				
			||||||
 | 
						for(pt1 = 0; pt1 <= 1000; ++pt1) {
 | 
				
			||||||
 | 
					        while(__sync_lock_test_and_set(&lock2,1));
 | 
				
			||||||
 | 
					        while(__sync_lock_test_and_set(&lock1,1));
 | 
				
			||||||
 | 
					        while(__sync_lock_test_and_set(&lock3,1));
 | 
				
			||||||
 | 
					        // while(lock_stream1.test_and_set());
 | 
				
			||||||
 | 
					        // while(lock_stream2.test_and_set());
 | 
				
			||||||
 | 
					        printf("thread number : %d\tindex : %d\n", my_number, pt1);
 | 
				
			||||||
 | 
					        for(int i = 1; i < height-1; i++)
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            for(int j = 1; j < width-1; j++)
 | 
				
			||||||
 | 
					            {
 | 
				
			||||||
 | 
					                for(int k = 0; k < 3; k++)
 | 
				
			||||||
 | 
					                {
 | 
				
			||||||
 | 
					                    details->image_pixels[i][j][k] = max(0, (input_image->image_pixels[i][j][k] - smoother->image_pixels[i][j][k]));
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        __sync_lock_release(&lock1);	
 | 
				
			||||||
 | 
					        __sync_lock_release(&lock4);	
 | 
				
			||||||
 | 
					        __sync_lock_release(&lock3);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        if(pt >= 1000)
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            __sync_lock_release(&lock2);
 | 
				
			||||||
 | 
					        }	
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						return nullptr;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void* S3_sharpen(void* thread_number)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						int my_number = *(int *)thread_number;
 | 
				
			||||||
 | 
						int width = input_image->width;
 | 
				
			||||||
 | 
						int height = input_image->height;
 | 
				
			||||||
 | 
					    for(int pt2 = 1; pt2 <= 1000; ++pt2) {
 | 
				
			||||||
 | 
					        // while(lock_stream2.test_and_set());
 | 
				
			||||||
 | 
					        while (__sync_lock_test_and_set(&lock4, 1));
 | 
				
			||||||
 | 
					        while (__sync_lock_test_and_set(&lock3, 1));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        printf("thread number : %d\tindex : %d\n", my_number, pt2);
 | 
				
			||||||
 | 
					        for(int i = 1; i < height-1; i++)
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            for(int j = 1; j < width-1; j++)
 | 
				
			||||||
 | 
					            {
 | 
				
			||||||
 | 
					                for(int k = 0; k < 3; k++)
 | 
				
			||||||
 | 
					                {
 | 
				
			||||||
 | 
					                    sharp->image_pixels[i][j][k] = min(255, input_image->image_pixels[i][j][k] + details->image_pixels[i][j][k]) * a;
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        __sync_lock_release(&lock3);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        if(pt1 >= 1000)
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            __sync_lock_release(&lock4);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						return nullptr; 
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					int main(int argc, char *argv[]) {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						pthread_t thread1, thread2, thread3;
 | 
				
			||||||
 | 
						int  iret1, iret2, iret3;
 | 
				
			||||||
 | 
						int thread_number1 = 1, thread_number2 = 2, thread_number3 = 3;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    input_image = read_ppm_file(argv[1]);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    smoother = new struct image_t;
 | 
				
			||||||
 | 
					    details = new struct image_t;
 | 
				
			||||||
 | 
					    sharp = new struct image_t;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    int width = input_image->width;
 | 
				
			||||||
 | 
						int height = input_image->height;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    // memory allocation for global smoothened image ------------ threads share same global variable
 | 
				
			||||||
 | 
					    smoother->height = height;
 | 
				
			||||||
 | 
						smoother->width = width;
 | 
				
			||||||
 | 
						smoother->image_pixels = new uint8_t**[height];
 | 
				
			||||||
 | 
						for(int i = 0; i < height; i++)
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							smoother->image_pixels[i] = new uint8_t*[width];
 | 
				
			||||||
 | 
							for(int j = 0; j < width; j++)
 | 
				
			||||||
 | 
								smoother->image_pixels[i][j] = new uint8_t[3];
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    // memory allocation for global detailed image
 | 
				
			||||||
 | 
					    details->height = height;
 | 
				
			||||||
 | 
						details->width = width;
 | 
				
			||||||
 | 
						details->image_pixels = new uint8_t**[height];
 | 
				
			||||||
 | 
						
 | 
				
			||||||
 | 
						for(int i = 0; i < height; i++)
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							details->image_pixels[i] = new uint8_t*[width];
 | 
				
			||||||
 | 
							for(int j = 0; j < width; j++)
 | 
				
			||||||
 | 
								details->image_pixels[i][j] = new uint8_t[3];
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    // memory allocation for global sharper image
 | 
				
			||||||
 | 
						sharp->height = height;
 | 
				
			||||||
 | 
						sharp->width = width;
 | 
				
			||||||
 | 
						sharp->image_pixels = new uint8_t**[height];
 | 
				
			||||||
 | 
						
 | 
				
			||||||
 | 
						for(int i = 0; i < height; i++)
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							sharp->image_pixels[i] = new uint8_t*[width];
 | 
				
			||||||
 | 
							for(int j = 0; j < width; j++)
 | 
				
			||||||
 | 
								sharp->image_pixels[i][j] = new uint8_t[3];
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						/* Create independent threads each of which will execute function */
 | 
				
			||||||
 | 
						iret1 = pthread_create(&thread1, NULL, S1_smoothen, &thread_number1);
 | 
				
			||||||
 | 
						if(iret1)
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							fprintf(stderr,"Error - pthread_create() return code: %d\n",iret1);
 | 
				
			||||||
 | 
							exit(EXIT_FAILURE);
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						iret2 = pthread_create(&thread2, NULL, S2_find_details, &thread_number2);
 | 
				
			||||||
 | 
						if(iret2)
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							fprintf(stderr,"Error - pthread_create() return code: %d\n",iret2);
 | 
				
			||||||
 | 
							exit(EXIT_FAILURE);
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					    iret3 = pthread_create(&thread3, NULL, S3_sharpen, &thread_number3);
 | 
				
			||||||
 | 
						if(iret3)
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							fprintf(stderr,"Error - pthread_create() return code: %d\n",iret3);
 | 
				
			||||||
 | 
							exit(EXIT_FAILURE);
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						pthread_join(thread1, NULL);
 | 
				
			||||||
 | 
						pthread_join(thread2, NULL);
 | 
				
			||||||
 | 
						pthread_join(thread3, NULL);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// printf("\nsum = %d\n", sum);
 | 
				
			||||||
 | 
					    printf("ttis");
 | 
				
			||||||
 | 
						exit(EXIT_SUCCESS);
 | 
				
			||||||
 | 
					    return 1;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
		Loading…
	
		Reference in New Issue