我正在尝试创建一个线程列表,这些线程将被锁定并按列表的顺序执行。这是代码(这是一个繁忙的等待模拟,我有一个课程)
# include <stdio.h>
# include<pthread.h>
# include<stdlib.h>
# define NKIDS 10
pthread_mutex_t mutx;
struct kidrec {
int data;
pthread_t id;
};
struct coada {
struct kidrec th;
struct coada *next;
};
void *copilfunc(void*p)
{
int *ip=(int*)p;
int tmp;
int v;
pthread_mutex_lock(&mutx);
tmp=v; v=*ip;
printf(" We are at thread %d n",v);
pthread_mutex_unlock(&mutx);
}
int main(){
struct kidrec kids[NKIDS];
struct coada c[NKIDS];
int m;
for(m=0;m<NKIDS;m++){
kids[m].data=m;
pthread_create(&kids[m].id,NULL,copilfunc,&kids[m].data);
c[m].th=kids[m];
if(m>0) c[m-1]->next=c[m];
if(m==NKIDS) c[NKIDS]->next=c[0];
}
for(m=0;m<NKIDS;m++)
pthread_join(c[m].th.id,NULL);
}
您正试图使用->访问结构数组上的属性,->是一个用于指针(非数组)的访问运算符。。。尝试使用
c[i].next = &c[j]
而不是
c[i]->next = c[j]
;)
变量c[]
是struct coada
的数组,而不是struct coada *
。
因此表达式c[m-1]
是一个struct coada
,您可以使用.
访问它的字段。
因此,它应该是:
c[m - 1].next = &c[m];
next
是指针并不重要,句点用于访问其左侧的struct
类型的值。还需要注意的是,您需要获取数组元素的地址,即右侧的&
。