我一直在学习如何使用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
为什么我在线程内调用的函数中的mutex值发生了变化?不知何故,我丢失了对互斥锁的引用?
发布于 2019-03-13 00:40:53
我不知道你的代码为什么会失败。不幸的是,就我们目前的目的而言,您的代码在我的机器上是成功的。
在其他人发布正确的答案之前,如果你想和我一起尝试一些调试想法,在你的选择下,我们可以尝试以下方法。
试试@AndrewHenle的建议:“在这两种情况下,sem_getvalue()
返回的是什么?如果它返回的是非零,那么errno
是什么?”
作为参考,在我的机器上(Debian GNU/Linux9,GCC 6.3,Pthreads2.24),它返回零,errno
也是零。
试着改变
sem_t mutex;
至
volatile unsigned char buffer_before_mutex[0x1000];
sem_t mutex;
volatile unsigned char buffer_after_mutex[0x1000];
原因:如果有什么东西在堆栈上覆盖了你的互斥锁,这可能会给它留出一些空闲的空间来覆盖它,而不是破坏互斥锁。即使它能工作(我怀疑它不能工作),它也不会是正确的;但是它可能提供关于您的代码出了什么问题的线索。
(我的回答可能已经被评论取代了。我在这里留下了答案,以防其中的一部分被证明是有用的。)
https://stackoverflow.com/questions/55132323
复制