#include #include #include #include #define MATRIX_SIZE 4 // Size of the matrix (example 4x4) #define NUM_THREADS (MATRIX_SIZE * 2) // Number of threads for matrix's rows and columns int matrix[MATRIX_SIZE][MATRIX_SIZE]; pthread_barrier_t barrier; // Function to swap two elements void swap(int *a, int *b) { int temp = *a; *a = *b; *b = temp; } // Function executed by each thread to sort a row or column void *sort_row_or_column(void *arg) { int index = *(int*)arg; for (int phase = 0; phase < MATRIX_SIZE; phase++) { for (int i = 0; i < MATRIX_SIZE - 1; i++) { if (index < MATRIX_SIZE) { // Sort a row if ((phase % 2 == 0 && matrix[index][i] > matrix[index][i + 1]) || (phase % 2 != 0 && matrix[index][i] < matrix[index][i + 1])) { swap(&matrix[index][i], &matrix[index][i + 1]); } } else { // Sort a column int col = index - MATRIX_SIZE; if (matrix[i][col] > matrix[i + 1][col]) { swap(&matrix[i][col], &matrix[i + 1][col]); } } } // Synchronize all threads at the barrier pthread_barrier_wait(&barrier); } pthread_exit(NULL); } int main() { pthread_t threads[NUM_THREADS]; int thread_args[NUM_THREADS]; int status; // Initialize the matrix and barrier srand(time(NULL)); // Seed for random numbers for (int i = 0; i < MATRIX_SIZE; i++) { for (int j = 0; j < MATRIX_SIZE; j++) { matrix[i][j] = rand() % 100; // Random numbers between 0 and 99 } } pthread_barrier_init(&barrier, NULL, NUM_THREADS); // Create threads for sorting for (int i = 0; i < NUM_THREADS; i++) { thread_args[i] = i; status = pthread_create(&threads[i], NULL, sort_row_or_column, (void *)&thread_args[i]); if (status != 0) { printf("ERROR; return code from pthread_create() is %d\n", status); exit(-1); } } // Wait for all threads to complete for (int i = 0; i < NUM_THREADS; i++) { pthread_join(threads[i], NULL); } // Print the sorted matrix printf("Sorted Matrix:\n"); for (int i = 0; i < MATRIX_SIZE; i++) { for (int j = 0; j < MATRIX_SIZE; j++) { printf("%d ", matrix[i][j]); } printf("\n"); } // Clean up and exit pthread_barrier_destroy(&barrier); return 0; }