我在做一个并发服务器,我有一个进程,它的功能是连接关闭的线程。问题是我在他检查线程是否工作的时候遇到了分段错误。
在这里,我将状态初始化为2,这意味着仍然没有执行。我执行线程
for (int i = 0; i < Max_threads; i++){
clients_data[i].client_number = 0;
clients_data[i].status = 2;
}
pthread_create(&tjoins, NULL, (void *(*) (void *))process_joins, (void*)&clients_data);
这是函数:
void* process_joins(struct clients* data[Max_threads]){
while (true){
for (int i = 0; i < Max_threads; i++){
if(data[i]->status == 0){
pthread_join(tclient[data[i]->position], (void**)&data[i]->info);
data[i]->client_number = 0;
}
}
}
return 0;
在执行printf检查代码中断的位置时,我知道它发生在以下行:
if(data[i]->status==0){
提前谢谢你。
最佳答案
我想你已经声明-
struct clients clients_data[Max_threads];
您正在将
clients_data
传递给函数,该函数的类型为-&clients_data
。但函数所期望的是struct clients (*)[Max_threads]
。这两件事都不一样。若要解决此问题,可以将函数定义更改为-
void* process_joins(struct clients (*data)[Max_threads]){
while (true){
for (int i = 0; i < Max_threads; i++){
if((*data)[i].status == 0){
pthread_join(tclient[(*data)[i].position], (void**) &((*data)[i].info));
(*data)[i].client_number = 0;
}
}
}
}
但是由于这个函数应该期望
struct clients* [Max_threads]
,我建议使用void *process_joins(void *data_ptr) {
struct clients (*data)[Max_threads] = data_ptr;
// Rest of the function same as above
}
现在,虽然这可以解决您的问题,但实际上不需要指向数组的指针,只需将指向第一个元素的指针作为-
pthread_create(&tjoins, NULL, (void *(*) (void *))process_joins, (void*)clients_data);
把你的功能定义为-
void* process_joins(void *clients_data_ptr){
struct clients *data = clients_data_ptr;
while (true){
for (int i = 0; i < Max_threads; i++){
if((data[i].status == 0){
pthread_join(tclient[data[i].position], (void**) &(data[i].info));
data[i].client_number = 0;
}
}
}
}
关于c - 做并发服务器的C中的段错误,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/52879037/