You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

结构体中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;
}

关键修改说明

  1. 初始化互斥锁:在main函数的循环里,给每个check[i].lock调用pthread_mutex_init初始化,确保锁处于合法可用状态。
  2. 修正参数传递:创建printthis线程时,直接传递check(指向结构体数组的指针),而不是&check,这样printthis函数里的类型转换就正确了,能正常访问数组里的每个结构体。
  3. 线程等待顺序调整:原来的逻辑中trythis是无限循环线程,会导致main一直阻塞无法等待printthis完成,我调整了join顺序,先等printthis执行完,你可以根据需求添加pthread_cancel来终止无限循环的工作线程。

内容的提问来源于stack exchange,提问作者Manu

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 07:43:49