Этот код иногда работает, а иногда нет. Во-первых, поскольку вы не предоставили полную программу, вот недостающие биты, которые я использовал для тестирования:
#include <stdlib.h>
#include <pthread.h>
static pthread_cond_t cond;
static pthread_mutex_t lock;
static pindex;
/* ... your code ... */
int main () {
int id[5], i;
pthread_t tid[5];
for (i = 0; i < 5; ++i) {
id[i] = i;
pthread_create(tid+i, 0, PhilosopherThread, id+i);
}
for (i = 0; i < 5; ++i) pthread_join(tid[i], 0);
exit(0);
}
Важная вещь, которую стоит заметить, это то, как вы просыпаетесь, следующий философ:
pthread_cond_signal(&cond);
Этот вызов разбудит только одну нить. Но, какой поток находится на усмотрение ОС. Следовательно, если не случится разбудить философа, который должен проснуться, ни один другой философ не проснется.
Простым решением было бы разбудить все ожидающие потоки вместо одного. Не подходящие философы вернутся к ожиданию, а тот, который должен идти дальше, уйдет.
pthread_cond_broadcast(&cond);
Однако, поскольку каждый поток знает, какого философа следует разбудить, вы можете изменить свое решение, чтобы это произошло. Одним из способов может быть реализация отдельной условной переменной для каждого философа и использование pthread_cond_signal()
в условной переменной следующего философа.