Я играю с довольно простым примером. Программа создает два потока и запускает их параллельно. Каждый поток предназначен для изменения глобальной переменной с использованием 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
ли я что-то отсутствует?
В будущем укажите полноту (или, по крайней мере, соответствующие части) вашей функции 'main', чтобы мы могли найти эти ошибки тоже :) –
@ Daniel Вы абсолютно правы. Я ошибочно предположил, что 'main()' был достаточно прост, который не заслуживал публикации. –
Он не может создать предупреждение или ошибку во время компиляции ... Как ваш компилятор знал бы, что эту функцию следует вызывать? Как он найдет, если это действительно называется? Помните, что не инициализация переменных является очень распространенной ошибкой в C, это не запрещено. Это UB использовать их. Это именно то, что случилось с вами с вашим мьютексом. –