Saya telah mempelajari cara menggunakan pthreads
dan mutex, dan saya bingung dengan keluaran kode C berikut:
#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);
}
Saya kemudian mengkompilasi ini seperti g++ -lpthread mutexTest.c -o mutexTest
dan menjalankannya dengan ./mutexText
, yang menghasilkan dan menghasilkan seperti
value of mutex in Thread function: 0
value of mutex in function in Thread function: 1754151134
Mengapa nilai mutex berubah pada fungsi yang saya panggil di dalam thread? Apakah saya kehilangan referensi ke mutex?
sem_init(&mutex, 0, 0);
. Jika hal ini mengubah perilaku, beri tahu kami. - 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
dang++
keduanya merupakan alias untuk rangkaian kompiler Mac. Saya tidak dapat melakukan repro di kotak linux saya. Semoga orang lain memiliki Mac. - person bruceg   schedule 13.03.2019sem_getvalue()
kembalikan dalam kedua kasus tersebut? Jika hasilnya bukan nol, apa ituerrno
?sem_getvalue()
di Mac sepertinya merepotkan. Lihat stackoverflow.com/questions/ 16655153/ dan stackoverflow.com/questions/23146950/ - person Andrew Henle   schedule 13.03.2019errno
diatur ke 78 dalam kedua kasus. Tampaknya ini berarti fungsinya tidak disetel. Menarik. - person TheStrangeQuark   schedule 13.03.2019-Wall
. - person user3386109   schedule 13.03.2019errno
disetel ke 0 dalam kedua kasus tersebut. Sebagai informasi juga, saya mengkompilasi dengan-Wall
dan, tentu saja, juga dengan-Wextra -Werror
. - person thb   schedule 13.03.2019pthread_mutex_create
,pthread_mutex_lock
danpthread_mutex_unlock
. - person user3386109   schedule 13.03.2019