#include #include #include #include #include #define NUM_THREADS 4 #define OPS_PER_THREAD 5 int balance = 1000; // shared resource pthread_mutex_t balance_mutex; void *bank_worker(void *arg) { int id = *(int *)arg; for (int i = 0; i < OPS_PER_THREAD; i++) { int amount = (rand() % 400) + 100; // 100–499 int is_deposit = rand() % 2; pthread_mutex_lock(&balance_mutex); if (is_deposit) { balance += amount; printf("[Thread %d] Deposit %d | Balance = %d\n", id, amount, balance); } else { if (balance >= amount) { balance -= amount; printf("[Thread %d] Withdraw %d | Balance = %d\n", id, amount, balance); } else { printf("[Thread %d] Withdraw %d FAILED (insufficient funds) | Balance = %d\n", id, amount, balance); } } pthread_mutex_unlock(&balance_mutex); usleep(100000); } return NULL; } int main() { pthread_t threads[NUM_THREADS]; int ids[NUM_THREADS]; srand((unsigned int)time(NULL)); pthread_mutex_init(&balance_mutex, NULL); printf("Initial balance = %d\n\n", balance); for (int i = 0; i < NUM_THREADS; i++) { ids[i] = i; pthread_create(&threads[i], NULL, bank_worker, &ids[i]); } for (int i = 0; i < NUM_THREADS; i++) pthread_join(threads[i], NULL); printf("\nFinal balance = %d\n", balance); pthread_mutex_destroy(&balance_mutex); return 0; }