我一直在学习如何使用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
为什么我在线程内调用的函数中的互斥锁值会更改?我是否以某种方式丢失了对互斥量的引用?
答案 0 :(得分:0)
我不知道您的代码为什么失败。不幸的是,出于我们目前的目的,您的代码在我的机器上成功了。
在其他人发布正确答案之前,如果您想和我一起尝试一些调试想法,我们可以选择以下方法。
1。
尝试使用@AndrewHenle的建议:“两种情况下sem_getvalue()
返回的是什么?如果返回非零,则errno
是什么?”
有关信息,在我的机器(Debian GNU / Linux 9,GCC 6.3,Pthreads 2.24)上,它返回零,并且errno
也为零。
2。 尝试更改
sem_t mutex;
到
volatile unsigned char buffer_before_mutex[0x1000];
sem_t mutex;
volatile unsigned char buffer_after_mutex[0x1000];
原因:如果某些内容正在覆盖堆栈上的互斥锁,则可能会给它留出一些空白空间来覆盖而不是将互斥锁丢弃。即使这行得通(我怀疑这不会),这也不对。但它可能为您的代码出了什么问题提供线索。
3。 (我的答案可能已被注释所取代。我将答案留在这里,以防万一它仍然有用。)