教了这么多年,帮学生调过那么多试程序,没留下任何痕迹,这里面不乏一些有趣的例子。今天帮助一个学生解决问题的时候,突然想到,把一些还算有趣的例子记录下来,倘能再活10年来看,或许有些感慨吧。
下面经过修改后的代码来自操作系统课程设计,原来的params只是一个变量。学生的问题是:“创建了4个线程,怎么看不到4个运行",原因很简单,4个都运行了,因为共享一个params,所以互相覆盖标识,导致printf输出错误的标识误导学生,解决方式很简单,每线程一个params
void *thread_function(void *arg)
{
struct param *dirinfo = (struct param *)arg;
char *name;
struct RetVal * ret=NULL;
while(h!=NULL)
{
/*************************************************************/
pthread_mutex_lock(&mymutex);
printf("I am thread %d\n",dirinfo->id);
// printf("%s \n",h->name);
name=h->name;
h=h->next;
pthread_mutex_unlock(&mymutex);
/*************************************************************/
ret=Search_id_infile(dirinfo->dir,name,dirinfo->key);//在文件中查找key
// printf("I am %d\n",dirinfo->id);
}
return NULL;
}
int main(int argc,char *argv[])
{
long thread_num=1;
pthread_t *thread_id;
struct param *params;//每个线程应有一个独立的拷贝
fileName *p;
int i,fd,f_num=0;
char *dir,*key;
if(argc==3)//启动一个线程
{
thread_num=1;
dir = argv[2];
key=argv[1];
}
else if(argc==5)//启动argv[2]个线程
{
if(strcmp(argv[1],"-j")!=0)
perror("Useage:idfind [-j n] id dirname");
else
thread_num=atoll(argv[2]);//字符串转换成整型
dir = argv[4];
key=argv[3];
}
//printf("%ld\n",thread_num);
if((thread_id = (pthread_t*)malloc(sizeof(pthread_t)*thread_num))==NULL)
handle_error("malloc");
if((fd = open(argc > 1 ? dir : ".", O_RDONLY | O_DIRECTORY)) == -1)
handle_error("open dir");
//////////////////////////////////////////////////////////////////////////////////////
f_num=Getdirents(fd);//获取文件目录下到所有普通文件
//////////////////////////////////////////////////////////////////////////////////////
close(fd);
h=Head;
thread_num = thread_num > f_num ? f_num : thread_num;
if((params = (struct param*)malloc(sizeof(struct param)*thread_num))==NULL)
handle_error("malloc params");
for(i=0;i {
params[i].id=i; //线程标示符
strcpy(params[i].dir,dir);
strcpy(params[i].key,key); //文件名链表头指针
}
for(i=0;i {
//线程执行时,传递给参数的指针指向的地址应该不同,否则将会被覆盖
if(pthread_create(&thread_id[i],NULL,thread_function,¶ms[i]))//创建线程
handle_error("create thread.");
}
for(i=0;i {
if(pthread_join(thread_id[i],NULL))
handle_error("joining thread.");
}
阅读(960) | 评论(0) | 转发(0) |