2016-03-01 4 views
0

Я пытаюсь запрограммировать о семафорах, и проблема в том, что вывод 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

+0

Подпись функции потока неверна, должна быть 'void * foo (void *)'. Эта «задержка» для цикла, скорее всего, устраняется компилятором, использует функцию типа 'sleep' для получения задержки. Вы компилируете (и связываете) с '-pthread'? – Mat

+0

Пожалуйста, объясните, какой заказ вы ожидали, и почему. –

+0

Обратите внимание, что поток * main() * должен ждать завершения его дочерних потоков. – tofro

ответ

-1

код выглядит нормально, так что может быть действительно до PRINTF буферов. Попробуйте добавить fflush(stdout); после вашего printf.

+0

Я думаю, что вы не поняли ни выход программы, ни поведение 'printf', которое делает автоматическое' fflush() 'при столкновении с' \ n', а дескриптор вывода - это терминал устройства. –

+0

Полностью согласен: «fflush (stdout)» ничего не влияет. – EMI

Смежные вопросы