Я изучаю, как использовать pthreads
и мьютексы, и меня смущает вывод следующего кода C:
#include <pthread.h>
#include <semaphore.h>
#include <stdio.h>
#include <stdlib.h>
void *TestThread(void *);
void TestFunc();
sem_t mutex;
int main(int argc, char *argv[]) {
pthread_t tid;
sem_init(&mutex, 1, 0);
pthread_create(&tid, NULL, TestThread, NULL);
pthread_join(tid, NULL);
}
void *TestThread(void *arg) {
int val;
sem_getvalue(&mutex, &val);
printf("value of mutex in Thread function: %d\n", val);
TestFunc();
pthread_exit(NULL);
}
void TestFunc() {
int val;
sem_getvalue(&mutex, &val);
printf("value of mutex in function in Thread function: %d\n", val);
}
Затем я компилирую это как g++ -lpthread mutexTest.c -o mutexTest
и запускаю с ./mutexText
, что дает и выводит как
value of mutex in Thread function: 0
value of mutex in function in Thread function: 1754151134
Почему значение мьютекса изменяется в функции, которую я вызываю в потоке? Я как-то потерял ссылку на мьютекс?
sem_init(&mutex, 0, 0);
. Если это изменит поведение, сообщите нам об этом. - person thb   schedule 13.03.2019Configured with: --prefix=/Library/Developer/CommandLineTools/usr --with-gxx-include-dir=/usr/include/c++/4.2.1 Apple LLVM version 10.0.0 (clang-1000.10.44.4) Target: x86_64-apple-darwin18.2.0 Thread model: posix InstalledDir: /Library/Developer/CommandLineTools/usr/bin
- person TheStrangeQuark   schedule 13.03.2019gcc
иg++
оба являются псевдонимами для комплекта компилятора Mac. Я не могу воспроизвести на своем Linux-боксе. Надеюсь, у кого-то еще есть Mac. - person bruceg   schedule 13.03.2019sem_getvalue()
возвращает в обоих случаях? Если он возвращает ненулевое значение, что такоеerrno
?sem_getvalue()
на Mac кажется проблематичным. См. раздел stackoverflow.com/questions/ 16655153/ и stackoverflow.com/questions/23146950/ - person Andrew Henle   schedule 13.03.2019errno
в обоих случаях установлено на 78. Похоже, это означает, что функция не установлена. Интересно. - person TheStrangeQuark   schedule 13.03.2019-Wall
. - person user3386109   schedule 13.03.2019errno
установлено в 0 в обоих случаях. Также для сведения, компилирую с-Wall
и, действительно, еще и с-Wextra -Werror
. - person thb   schedule 13.03.2019pthread_mutex_create
,pthread_mutex_lock
иpthread_mutex_unlock
. - person user3386109   schedule 13.03.2019