Вы создали «частные» мьютексы и условные переменные для каждого потока, поэтому они не синхронизируются никаким (значимым) способом. Вместо этого:
pthread_mutex_t mutex = globalMutex;
pthread_cond_t condition = globalCond;
Просто используйте globalMutex и globalCond - это то, что вы действительно хотите.
[
Я перенес это сюда, потому что я думаю, что мы должны. Я не могу интуитивно понять SO-Iquette.
]
Кстати, просто чтобы убедиться, что я понимаю это, мьютекс
ячейка, так что несколько потоков могут работать на нескольких ячейках
одновременно, верно? Просто не две темы в одной ячейке. -
Итак, вы, вероятно, хотите что-то похожее на:
typedef struct myStruct {
int cellId;
pthread_mutex_t lock;
pthread_cond_t wait;
} myStruct;
и в InitMyStruct ():
myStructs[i]->cellId = i % THREADS_NUM;
pthread_mutex_init(&myStructs[i]->lock, NULL);
pthread_cond_init(&myStructs[i]->wait, NULL);
и в Halvers:
pthread_mutex_lock(&myStr->lock);
cells[id] /= 2;
pthread_cond_broadcast(&myStr->wait);
pthread_mutex_unlock(&myStr->lock);
и удвоитель:
...
pthread_mutex_lock(&myStr->lock);
while((cells[id] * 2) > MAX) {
printf("Waiting... id = %d\n", id);
pthread_cond_wait(&myStr->wait, &myStr->lock);
}
cells[id] *= 2;
printf("new val = %d, id = %d\n", cells[id], id);
pthread_mutex_unlock(&myStr->lock);
Так что в настоящее время только один поток может вносить изменения в массив одновременно?
Но затем программа завершается примерно через секунду, если потоки не могут
вносить изменения в массив одновременно, то не будет
Программа занимает 10 секунд, чтобы закончить, потому что каждый HalverThread спит
на 1 секунду. - Йос 6 часов
Халверс спят перед тем, как схватить мьютекс, поэтому все спят рядом, просыпаются, сражаются за мьютекс и продолжают.