结构体中pthread_mutex使用问题:print线程打印值始终为0的修正建议
问题排查与修改方案
嘿,我帮你找出了两个核心问题,正是它们导致printthis线程每次都输出0,咱们一步步来修正:
问题1:互斥锁未初始化,行为未定义
你的lock_check结构体里的pthread_mutex_t lock成员没有被初始化。根据POSIX标准,未初始化的互斥锁行为是完全未定义的——可能导致锁不住、死锁,甚至内存访问错误,这会直接影响线程间的同步逻辑。
问题2:printthis线程的参数传递错误
在main函数创建printthis线程时,你传递的是&check,但check本身就是struct lock_check*类型的指针(指向数组首元素),所以&check其实是struct lock_check**(指针的指针)。而你在printthis函数里把这个参数强制转换成了struct lock_check*,这就导致遍历print_thread[i]时,你访问的是完全错误的内存区域,自然读到的value都是0。
修改后的完整代码
#include<stdio.h> #include<string.h> #include<pthread.h> #include<stdlib.h> #include<unistd.h> struct lock_check{ int value; pthread_mutex_t lock; }; struct lock_check *check; void* trythis(void *arg) { struct lock_check *thread = (struct lock_check *)arg; while(1){ pthread_mutex_lock(&thread->lock); printf("Inside Thread with value:%d\n", thread->value); pthread_mutex_unlock(&thread->lock); sleep(1); } return NULL; } void* printthis(void *arg) { printf("Entering printthis thread\n"); // 这里直接用struct lock_check*接收,因为参数是指向数组的指针 struct lock_check *print_thread = (struct lock_check *)arg; for(int i = 0; i < 10; i++){ pthread_mutex_lock(&print_thread[i].lock); printf("Printing value :%d\n", print_thread[i].value); pthread_mutex_unlock(&print_thread[i].lock); } return NULL; } int main(void) { int i = 0; int error; check = malloc(sizeof(struct lock_check) * 10); pthread_t tid[10]; pthread_t tid_read; for (int i = 0; i < 10; i++) { check[i].value = i; // 初始化每个结构体的互斥锁 pthread_mutex_init(&check[i].lock, NULL); error = pthread_create(&(tid[i]), NULL, &trythis, &check[i]); if (error != 0) printf("\nThread can't be created :[%s]", strerror(error)); } sleep(5); printf("creating printthis thread\n"); // 这里直接传递check,而不是&check error = pthread_create(&tid_read, NULL, &printthis, check); if (error != 0) printf("\nPrint thread can't be created :[%s]", strerror(error)); // 先等待printthis线程执行完毕,否则main会一直阻塞在无限循环的trythis线程上 pthread_join(tid_read, NULL); // 如果需要终止trythis线程,可以使用pthread_cancel,示例: // for (int i = 0; i < 10; i++) { // pthread_cancel(tid[i]); // pthread_join(tid[i], NULL); // } return 0; }
关键修改说明
- 初始化互斥锁:在main函数的循环里,给每个
check[i].lock调用pthread_mutex_init初始化,确保锁处于合法可用状态。 - 修正参数传递:创建
printthis线程时,直接传递check(指向结构体数组的指针),而不是&check,这样printthis函数里的类型转换就正确了,能正常访问数组里的每个结构体。 - 线程等待顺序调整:原来的逻辑中
trythis是无限循环线程,会导致main一直阻塞无法等待printthis完成,我调整了join顺序,先等printthis执行完,你可以根据需求添加pthread_cancel来终止无限循环的工作线程。
内容的提问来源于stack exchange,提问作者Manu
相关产品推荐
相关产品推荐

