Я пытаюсь запрограммировать о семафорах, и проблема в том, что вывод Xcode не в истинном порядке. Я думаю, что это из-за буфера функций printf(). Я даю код, и результат его в Xcode. Есть некоторые части кода, такие как «for (int i = 0; i < 10000; i ++)», чтобы обеспечить взаимные исключения и повреждение данных. Вот код:Xcode C Программирование - порядок вывода неправильный
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <pthread.h>
#include <semaphore.h>
#define NUM_THREADS 3
int ctr = 0;
sem_t sem;
void *IncCounter();
int main(void) {
int ret_value;
pthread_t threads[NUM_THREADS];
sem_init(&sem, 0, 1);
for(int t=0; t<NUM_THREADS; t++){
ret_value=pthread_create(&threads[t], NULL, IncCounter, NULL);
}
pthread_exit(NULL);
}
void *IncCounter(){
for (int l=0; l<5; l++) {
sem_wait(&sem);
++ctr;
for (int i=0; i<10000; i++) {
}
printf("Counter is: %d\n", ctr);
sem_post(&sem);
}
pthread_exit(NULL);
return NULL;
}
Теперь я даю вывод, который я беру с Xcode.
Counter is: 3
Counter is: 3
Counter is: 3
Counter is: 6
Counter is: 7
Counter is: 8
Counter is: 9
Counter is: 10
Counter is: 10
Counter is: 12
Counter is: 13
Counter is: 14
Counter is: 14
Counter is: 14
Counter is: 15
Program ended with exit code: 0
Как я могу избежать этого? Большое спасибо за чтение,
Mert
Подпись функции потока неверна, должна быть 'void * foo (void *)'. Эта «задержка» для цикла, скорее всего, устраняется компилятором, использует функцию типа 'sleep' для получения задержки. Вы компилируете (и связываете) с '-pthread'? – Mat
Пожалуйста, объясните, какой заказ вы ожидали, и почему. –
Обратите внимание, что поток * main() * должен ждать завершения его дочерних потоков. – tofro