#include #include #include #include #define MAX_JOBS 10 int jobs_pending = 0; int shutdown_flag = 0; pthread_mutex_t job_mutex = PTHREAD_MUTEX_INITIALIZER; pthread_cond_t job_available = PTHREAD_COND_INITIALIZER; void *worker(void *arg) { int id = *(int *)arg; while (1) { pthread_mutex_lock(&job_mutex); // wait until there is a job OR shutdown is signalled while (jobs_pending == 0 && !shutdown_flag) pthread_cond_wait(&job_available, &job_mutex); if (shutdown_flag && jobs_pending == 0) { pthread_mutex_unlock(&job_mutex); printf("[Worker %d] No more jobs, shutting down.\n", id); break; } // "consume" one job jobs_pending--; int job_id = rand() % 1000; printf("[Worker %d] Processing job ID %d (Jobs left: %d)\n", id, job_id, jobs_pending); pthread_mutex_unlock(&job_mutex); usleep(150000); } return NULL; } int main() { pthread_t worker_thread; int worker_id = 1; pthread_create(&worker_thread, NULL, worker, &worker_id); // simulate incoming jobs for (int i = 1; i <= MAX_JOBS; i++) { pthread_mutex_lock(&job_mutex); jobs_pending++; printf("[Main] Added job %d (Jobs pending: %d)\n", i, jobs_pending); pthread_cond_signal(&job_available); pthread_mutex_unlock(&job_mutex); usleep(100000); } // signal shutdown pthread_mutex_lock(&job_mutex); shutdown_flag = 1; pthread_cond_signal(&job_available); // wake up worker pthread_mutex_unlock(&job_mutex); pthread_join(worker_thread, NULL); pthread_mutex_destroy(&job_mutex); pthread_cond_destroy(&job_available); return 0; }