函数内部的信号量值与线程函数不一致

问题描述 投票:3回答:1

我一直在学习如何使用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

为什么我在线程中调用的函数中的互斥量值会发生变化?我是否以某种方式丢失了对互斥锁的引用?

c pthreads semaphore
1个回答
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.(我的回答可能已被评论所取代。我在这里留下答案,以防部分证明是有用的。)

© www.soinside.com 2019 - 2024. All rights reserved.