Кажется, что логика синхронизации вашего потока в порядке.
Единственная проблема заключалась в том, что вы фактически не сохраняли в массиве, когда у вас была возможность [и основной поток] распечатать его после присоединения кпотоки.
Кроме того, вам не нужны две отдельные функции потоков.Вы можете использовать один аргумент / значение, равное 0 или 1. То есть аргумент arg задает начальное смещение в массиве для потока и значение для хранения, а также необходимое значение для oktogo
.
В любом случае, вот рабочая версия:
#include <stdio.h>
#include <pthread.h>
int count = 0;
int oktogo = 0; // 0 is false, 1 is true. For thread2 this is reversed.
#define CHUNK 5
int array[5000];
pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
pthread_cond_t condition = PTHREAD_COND_INITIALIZER;
void *
start_thread(void *ptr)
{
long self = (long) ptr;
int i;
for (i = 1; i < 30; i++) {
pthread_mutex_lock(&mutex);
while (oktogo != self)
pthread_cond_wait(&condition, &mutex);
printf("thread %ld: %d\n",self,count);
for (int idx = 0; idx < CHUNK; ++idx, ++count)
array[count] = self;
oktogo = ! self;
pthread_mutex_unlock(&mutex);
pthread_cond_signal(&condition);
}
pthread_exit(0);
}
int
main()
{
int count = 0;
pthread_t p1,
p2;
for (int idx = 0; idx < sizeof(array) / sizeof(array[0]); ++idx)
array[idx] = -1;
pthread_create(&p1, NULL, (void *) start_thread, (void *) 0);
pthread_create(&p2, NULL, (void *) start_thread, (void *) 1);
pthread_join(p1, NULL);
pthread_join(p2, NULL);
for (int idx = 0; idx < sizeof(array) / sizeof(array[0]); ++idx) {
if (array[idx] >= 0)
printf("%d: %d\n",idx,array[idx]);
}
return (0);
}