2015-02-06 6 views
2

Я играю с довольно простым примером. Программа создает два потока и запускает их параллельно. Каждый поток предназначен для изменения глобальной переменной с использованием Mutex и печати значения.Синхронизация выходного экрана с мьютексом и pthread

#include <stdio.h> 
#include <stdlib.h> 
#include <unistd.h> 
#include <pthread.h> 

int A=10; 
pthread_mutex_t M; 

void *codice_Th1(void *arg) { 
    int i; 
    for (i=0; i<10;i++){ 
    pthread_mutex_lock(&M); 
    printf("Thread %s: ", (char *)arg); 
    A++; 
    printf("A = %d \n", A); 
    pthread_mutex_unlock(&M); 
    sleep(1); 
    } 
    pthread_exit(0); 
} 

void *codice_Th2(void *arg) { 
    int i; 
    for (i=0; i<10;i++){ 
    pthread_mutex_lock(&M); 
    printf("Thread %s: ", (char *)arg); 
    A--; 
    printf("A = %d \n", A); 
    pthread_mutex_unlock(&M); 
    sleep(1); 
    } 
    pthread_exit(0); 
} 

The main() просто создает поток, и присоединиться к основной нити с резьбой 1 и 2.

int main(){ 
    pthread_t th1, th2; 
    ... 
} 

Что беспокоит меня, что я получаю следующий вывод

Thread th1: Thread th2: A = 11 
A = 10 
Thread th1: A = 11 
Thread th2: A = 10 
Thread th1: Thread th2: A = 11 
A = 10 
Thread th1: Thread th2: A = 11 
A = 10 
Thread th2: Thread th1: A = 9 
A = 10 
Thread th1: A = 11 
Thread th2: A = 10 

тогда как я ожидал бы, что каждая строка будет выполнять операторы printf последовательно, если они находятся внутри мьютекса.

Другими словами, я не могу понять выводе

Thread th2: Thread th1: A = 9 

я ожидал бы всегда что-то похожее на

Thread NAME: A = VALUE 

ли я что-то отсутствует?

ответ

2

Ничего, я считаю, что нашел проблему. Я не инициализировал Mutex с pthread_mutex_init(&M, NULL); перед его использованием.

Установка

int main(){ 
    pthread_t th1, th2; 
    int ret; 

    pthread_mutex_init(&M, NULL); 

исправили проблему. Я предполагаю, что использование pthread_mutex_init является обязательным требованием. К сожалению, пропуская инициализацию мьютекса не выдает никаких предупреждений или ошибок. Сценарий беззвучно скомпилирован.

+2

В будущем укажите полноту (или, по крайней мере, соответствующие части) вашей функции 'main', чтобы мы могли найти эти ошибки тоже :) –

+0

@ Daniel Вы абсолютно правы. Я ошибочно предположил, что 'main()' был достаточно прост, который не заслуживал публикации. –

+0

Он не может создать предупреждение или ошибку во время компиляции ... Как ваш компилятор знал бы, что эту функцию следует вызывать? Как он найдет, если это действительно называется? Помните, что не инициализация переменных является очень распространенной ошибкой в ​​C, это не запрещено. Это UB использовать их. Это именно то, что случилось с вами с вашим мьютексом. –