#include #include #include #define NUM_THREADS 2 pthread_mutex_t lock1; pthread_mutex_t lock2; void* thread_function(void* arg) { int thread_id = *(int*)arg; if (thread_id == 0) { pthread_mutex_lock(&lock1); sleep(1); printf("Thread 0: Waiting for lock 2...\n"); if (pthread_mutex_trylock(&lock2) != 0) { printf("Thread 0: Failed to acquire lock 2, releasing lock 1.\n"); pthread_mutex_unlock(&lock1); } else { printf("Thread 0: Acquired both locks, doing work...\n"); sleep(1); pthread_mutex_unlock(&lock2); pthread_mutex_unlock(&lock1); } } else { pthread_mutex_lock(&lock2); sleep(1); printf("Thread 1: Waiting for lock 1...\n"); if (pthread_mutex_trylock(&lock1) != 0) { printf("Thread 1: Failed to acquire lock 1, releasing lock 2.\n"); pthread_mutex_unlock(&lock2); } else { printf("Thread 1: Acquired both locks, doing work...\n"); sleep(1); pthread_mutex_unlock(&lock1); pthread_mutex_unlock(&lock2); } } return NULL; } int main() { pthread_t threads[NUM_THREADS]; int thread_ids[NUM_THREADS] = {0, 1}; pthread_mutex_init(&lock1, NULL); pthread_mutex_init(&lock2, NULL); for (int i = 0; i < NUM_THREADS; i++) { pthread_create(&threads[i], NULL, thread_function, (void*)&thread_ids[i]); } for (int i = 0; i < NUM_THREADS; i++) { pthread_join(threads[i], NULL); } pthread_mutex_destroy(&lock1); pthread_mutex_destroy(&lock2); return 0; }