Listing 1
#include <pthread.h> pid_t child_pid; struct sched_param old_param; struct pthread_mutex_t mutex; void raise_child_priority() { struct sched_param current; // Get the priority of the current thread sched_getparam(0, ¤t); // Get the priority of the child thread sched_getparam(child_pid, &old_param); // If the current thread's priority is greater than the // child's priority, raise the child's priority if(current.sched_priority > old_param.sched_priority) { sched_setparam(child_pid, ¤t); } } void lower_child_priority() { // Set the child thread's priority back to its old priority sched_setparam(child_pid, &old_param); } int access_shared_resource() { // First, try to get a lock on the resource if(pthread_mutex_trylock(&mutex) < 0) { if(errno == EBUSY) { // The other thread has the resource, // raise its priority then perform a blocking lock raise_child_priority(); if(pthread_mutex_lock(&mutex) < 0) return -1; } else { return -1; } } // Lower the child's priority back to normal lower_child_priority(); /* Do stuff with the locked resource */ // Release the lock if(pthread_mutex_unlock(&lock) < 0) return -1; return 0; }