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

时间:2019-03-12 23:45:29

标签: c pthreads semaphore

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

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

1 个答案:

答案 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。 (我的答案可能已被注释所取代。我将答案留在这里,以防万一它仍然有用。)