Я работаю с pthreads и семафорами и пытаюсь выяснить, как сигнализировать конкретному потоку.
Поток, который я хочу сигнализировать с определенным условием, будет потоком, ожидающим в голове моей очереди.
Основная часть моего файла semaphore.h:
struct entry_thread {
int threadID;
SIMPLEQ_ENTRY(entry_thread) next;
} *np;
struct semaphore {
int count;
int headThreadID;
pthread_mutex_t mutex;
pthread_cond_t flag;
SIMPLEQ_HEAD(queuehead, entry_thread) head;
};
typedef struct semaphore semaphore_t;
И связанные части моего файла semaphore.c:
void down( semaphore_t* sem )
{
pthread_mutex_lock( &sem->mutex );
while ( sem->count <= 0)
{
// First check if queue is empty, if so, set a new headThreadID
if (SIMPLEQ_EMPTY( &(sem->head) ))
{
sem->headThreadID = pthread_self();
}
np = malloc( sizeof( struct entry_thread ) );
np->threadID = pthread_self();
SIMPLEQ_INSERT_TAIL( &(sem->head), np, next);
pthread_cond_wait( &sem->flag, &sem->mutex );
}
sem->count--;
pthread_mutex_unlock( &sem->mutex );
}
void up( semaphore_t* sem )
{
pthread_mutex_lock( &sem->mutex );
sem->count++;
if ( sem->count == 1 )
{
// Get the head of the semaphore's queue
SIMPLEQ_REMOVE_HEAD( &(sem->head), (np = SIMPLEQ_FIRST(&(sem->head))), next );
/* I WANT TO ONLY SIGNAL THE HEAD THREAD!!! */
pthread_cond_signal( &sem->flag );
/* THE ABOVE SIGNALS A RANDOM SINGLE THREAD */
free( np );
}
pthread_mutex_unlock( &sem->mutex );
}
Итак, моя проблема заключается в том, что, хотя я могу получить идентификатор потока, мне нужно иметь возможность сигнализировать этому потоку, что условие, которого он ожидает, изменилось, и он может снова проверить семафор. Мы будем очень признательны за любые советы.