2016-03-28 6 views
-1

Таким образом, два потока должны вызывать две функции runTimes, а функция runTimes должна звонить increase_count и decrease_count. В конце результат должен быть 3. Проблема в том, что последняя строка кода не выполняется, когда я запускаю программу, и я не могу определить, что вызывает состояние гонки.Состояние гонки C нить

#define MAX_RESOURCES 5 


int available_resources = MAX_RESOURCES; 
int times = 100000; 
pthread_mutex_t mutex; 
sem_t semaphore; 

/* decrease available_resources by count resources 
* return 0 if sufficient resources available, 
* otherwise return -1 */ 
int decrease_count(int count) { 
if (available_resources < count) { 
    return -1; 
} else { 
    available_resources -= count; 
    printf("Locked %i resources, now available: %i\n" , count , available_resources); 
    return 0; 
} 
} 


/* increase available resources by count */ 
int increase_count(int count) { 
if (count + available_resources > 5) { 
    return -1; 
} else { 
    available_resources += count; 
    printf("Freed %i resources, now available: %i\n" , count , available_resources); 
    return 0; 
} 
} 


void *runTimes(void *null) { 
int i = 0 , result; 
while (i < times) { 
    result = -1; 
    while (result < 0) {result = decrease_count(1);} 
    result = -1; 
    while (result < 0) {result = increase_count(1);} 
    i += 1; 
    printf("Count; %i\n",i); 
} 

return NULL; 
} 

int main(int argc, char *argv[]) 
{ 
pthread_t thread1 , thread0; 
pthread_t threads [2]; 

decrease_count(2); 

pthread_create(&thread0, NULL, runTimes, NULL); 
pthread_create(&thread1, NULL, runTimes, NULL); 

int i = 0; 
while(i < 2) { 
    pthread_join(threads[i], NULL); 
    i++; 
} 

pthread_exit(NULL); 


printf("Currently available resources (should be 3): %i\n" , available_resources); 

return 0; 
} 
+1

Пожалуйста отступы ваш код правильно. –

+0

исправлено, извините – Mattia

+0

"* исправлено *"? Я все еще вижу беспорядок. – alk

ответ

0

последняя строка кода не получает казнены

Это beacuse вы звоните

pthread_exit(NULL); 

перед вызовом этого

printf("Currently available resources (should be 3): %i\n" , available_resources); 

(последняя) линия.

pthread_exit() выходит из тока нити, то есть нить, которая вызывает функцию.


Гонка в коде, который вы показываете, не имеет отношения к этому. Это может произойти, потому что код не реализует никакой защиты от одновременного доступа к тем же переменным.


Также вы хотите присоединиться к тем, которые вы создали.

Чтобы сделать это изменить

pthread_create(&thread0, NULL, runTimes, NULL); 
pthread_create(&thread1, NULL, runTimes, NULL); 

быть

pthread_create(&threads[0], NULL, runTimes, NULL); 
pthread_create(&threads[1], NULL, runTimes, NULL); 
+0

если я положил его после того, как он не будет выполнен в любом случае, что мне делать? – Mattia

+1

Избавиться от «pthread_exit (NULL)»; прокомментировать это, удалить его, уничтожить, устранить, развернуть. –

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