C Pthread Mutex Segfault

C Pthread Mutex Segfault,c,multithreading,segmentation-fault,pthreads,mutex,C,Multithreading,Segmentation Fault,Pthreads,Mutex,我以前从未使用过pthreads,我只是想熟悉一下它们。因此,我编写了以下测试代码: #include <stdio.h> #include <stdlib.h> #include <pthread.h> int count = 0; void *increment(void *tex); int main(int argc, char **argv) { pthread_t t1, t2, t3; pthread_mutex_t mut

我以前从未使用过pthreads,我只是想熟悉一下它们。因此,我编写了以下测试代码:

#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>

int count = 0;

void *increment(void *tex);

int main(int argc, char **argv) {
    pthread_t t1, t2, t3;
    pthread_mutex_t mutex;
    pthread_mutex_init(&mutex, NULL);
    pthread_create(&t1, NULL, &increment, &mutex);
    pthread_create(&t2, NULL, &increment, &mutex);
    pthread_create(&t2, NULL, &increment, &mutex);
    pthread_join(t1, NULL);
    pthread_join(t2, NULL);
    pthread_join(t3, NULL);
    printf("Value of count is: %d\n", count);
}

void *increment(void *tex) {
    pthread_mutex_t *mutex = (pthread_mutex_t *) mutex;
    for (int i = 0; i < 100; i++) {
        pthread_mutex_lock(mutex);
        count++;
        pthread_mutex_unlock(mutex);
    }
    return NULL;
}
#包括
#包括
#包括
整数计数=0;
空隙*增量(空隙*tex);
int main(int argc,字符**argv){
pthread_t t1、t2、t3;
pthread_mutex_t mutex;
pthread_mutex_init(&mutex,NULL);
pthread_create(&t1,NULL,&increment,&mutex);
pthread_创建(&t2,NULL,&increment,&mutex);
pthread_创建(&t2,NULL,&increment,&mutex);
pthread_join(t1,NULL);
pthread_join(t2,NULL);
pthread_join(t3,NULL);
printf(“计数的值为:%d\n”,计数);
}
空隙*增量(空隙*tex){
pthread_mutex_t*mutex=(pthread_mutex_t*)mutex;
对于(int i=0;i<100;i++){
pthread_mutex_lock(互斥锁);
计数++;
pthread_mutex_unlock(互斥锁);
}
返回NULL;
}
我使用正确的-pthread标志使用GCC编译代码,但是,无论出于何种原因,任何线程到达互斥锁行segfault时。通过对GDB的进一步调查,我发现互斥指针在增量函数中似乎无效,尽管我在main中初始化了它,将它作为参数传递给pthread_create,并在每个线程上调用了join以确保main仍在作用域中。我不知道为什么会发生这种情况,我需要一些帮助。谢谢

你有:

pthread_mutex_t *mutex = (pthread_mutex_t *) mutex;
您需要的是:

pthread_mutex_t *mutex = (pthread_mutex_t *) tex;

... 即使在那里,C中的强制转换也是完全多余的。还有另一个打字错误,
t2
初始化两次,
t3
从未初始化。复制/粘贴可能会导致一些恼人的错误。此外,请注意,使用
-Wall
会警告
t3
未初始化
-Wall
不会对
互斥锁的自我初始化发出警告;如果真是这样的话,那就太好了(而且这似乎是一个很容易生成的诊断)。我甚至不知道自我初始化是一件事。还有,是的,我从来没有注意到t2被初始化了两次,因为程序总是在到达那一行之前出错。谢谢