Этот вопрос является продолжением этот вопрос. Суть в том, что у меня был сервер, вызывающий close () для завершения соединений, но казалось, что последовательность выключения никогда не происходила. Клиент продолжал ждать больше данных. close () вернул 0 на сервере. Переключение моей поточно-ориентированной очереди с условного ожидания на семафоры решило проблему, даже если условная очередь реализована правильно. Я публикую свой код, чтобы увидеть, есть ли у кого-нибудь какое-нибудь понимание этих вещей для меня.
очередь на основе условий:
TASK *head;
pthread_mutex_t mutex;
pthread_cond_t cond;
void init( ) {
head = NULL;
pthread_mutex_init(&mutex, NULL);
pthread_cond_init(&cond, NULL);
}
TASK *get( ) {
pthread_mutex_lock( &mutex );
while(!head)
pthread_cond_wait(&cond, &mutex);
TASK *res = head;
head = head->next;
pthread_mutex_unlock( &mutex );
return res;
}
void add( TASK *t ) {
pthread_mutex_lock( &mutex );
t->next = head;
head = t;
pthread_cond_broadcast( &cond );
pthread_mutex_unlock( &mutex );
}
Я понимаю, что это очередь LIFO, а следующая — FIFO, но я включил только интересные фрагменты, поэтому их легко и быстро прочитать.
основанная на семафоре очередь:
TASK *buf;
TASK *next_reader;
TASK *next_writer;
TASK *endp;
pthread_mutex_t writer_mutex;
pthread_mutex_t reader_mutex;
sem_t writer_sem;
sem_t reader_sem;
void init( int num_tasks ) {
buf = calloc(sizeof(TASK), num_tasks);
next_reader = buf;
next_writer = buf;
endp = buf + num_tasks;
sem_init(&writer_sem, 0, num_tasks);
sem_init(&reader_sem, 0, 0);
pthread_mutex_init(&writer_mutex, NULL);
pthread_mutex_init(&reader_mutex, NULL);
}
TASK *get( ) {
TASK *res = NULL;
sem_wait(&reader_sem);
pthread_mutex_lock(&reader_mutex);
res = next_reader;
next_reader++;
if(next_reader == endp)
next_reader = buf;
pthread_mutex_unlock(&reader_mutex);
sem_post(&writer_sem);
return res;
}
void add( TASK *t ) {
sem_wait(&writer_sem);
pthread_mutex_lock(&writer_mutex);
*next_writer = *item;
next_writer++;
if(next_writer == endp)
next_writer = buf;
pthread_mutex_unlock(&writer_mutex);
sem_post(&reader_sem);
}
Я не могу на всю жизнь увидеть, как изменение очереди условий на очередь семафоров разрешило бы предыдущий вопрос, который я отправил, если только не произойдут какие-то странные вещи, если поток закрывает сокет и во время закрытия вызывается pthread_cond_broadcast. Я предполагаю ошибку ОС, потому что не могу найти никакой документации, осуждающей то, что я делаю. Ни одно из действий очереди не вызывается из обработчиков сигналов. Вот мой дистрибутив:
Версия для Linux: 2.6.21.7-2.fc8xen
Версия Centos: 5.4 (финальная версия)
Спасибо
РЕДАКТИРОВАТЬ —- Я только что добавил в инициализации я делаю. В реальном коде они реализованы в шаблонном классе. Я только что включил соответствующие части.
Задача ещё не решена.
Других решений пока нет …