
作业社区
探索学习新天地,共享知识资源!
胡汉三66 的学生作业:
#include #include #include #include #include #include //实现生产者(子线程)与消费者(主线程)模型,并解决代码中线程资源的释放 //"./a.out 1 2 3" 表示三个线程,分别生产 1个产品 2个产品 3个产品.共6个产品 //释放资源方法,一是分离子线程用pthread_detach()函数,二是等待子线程结束,用pthread_join()函数.有详细代码标记 static int number;//共享资源,记录总共生产的产品 static pthread_mutex_t mtx = PTHREAD_MUTEX_INITIALIZER;//互斥锁,静态初始化 //子线程,生产者 void *thread_handler(void *arg) { //pthread_detach(pthread_self());//分离子线程,线程结束后,操作系统自动释放子线程资源 int i = 0; int cns = atoi((char*)arg);//将字符串参数 转变为 整数 for(i = 0;i < cns;i++) { pthread_mutex_lock(&mtx);//获得互斥锁 printf("子线程生产一个产品,现在有 %d 个产品\n",pthread_self(),++number); sleep(1); pthread_mutex_unlock(&mtx);//释放互斥锁 } pthread_exit((void *)0); } int main(int argc,char *argv[]) { pthread_t tid[argc]; int err,i = 0; bool done; int control_to_produce = 0;//定义总共生产的产品数 int control_to_consume = 0;//定义总共消费的产品数 for(i = 1;i < argc;i++) { control_to_produce += atoi((char *)argv[i]);//统计总共生产的产品 err = pthread_create(&tid[i],NULL,thread_handler,(void *)argv[i]);//创建子线程 if (err != 0) { fprintf(stderr,"[ERROR] pthread_create ():\n",strerror(err)); exit(EXIT_FAILURE); } //pthread_detach(tid[i]);//使子线程分离,等线程结束后,操作系统自动回收资源 } //消费产品 for(;;) { pthread_mutex_lock(&mtx);//获得互斥锁 while(number > 0) { control_to_consume++;//消费一个产品 printf("消费一个产品,现在有 %d 个产品\n",--number); done = control_to_consume >= control_to_produce; } pthread_mutex_unlock(&mtx);//释放互斥锁 if(done) { for(i = 1;i < argc;i++) { pthread_join(tid[i],NULL);//等待子线程结束,释放资源 } break; } } return 0; } 【图片】





胡汉三66 的学生作业:
没有互斥锁 #include #include #include #include //创建两个子线程,循环加法计算,不使用互斥锁 static int global;//全局静态变量,临界资源 void *do_thread(void *arg) { int loops,i,tmp; loops = *(int *)arg; for(i = 0;i < loops;i++) { tmp = global; tmp++; global = tmp; } pthread_exit(NULL); } //"./a.out 100"===>两个子线程,对global,循环100次,进行 +1 //argv[0] = "./a.out " argv[1] = "100" int main(int argc,char *argv[])//argc:命令行参数个数 argv[]:保存命令行每个参数 { int err,i; pthread_t tid[2]; if (argc != 2) { fprintf(stderr,"Usage \n",argv[0]); exit(EXIT_FAILURE); } int loops = atoi(argv[1]);//將第二个命令行参数,转化为整数."100" ==> 100 for (i = 0;i < 2;i++) { err = pthread_create(&tid[i],NULL,do_thread,(void *)&loops); if (err != 0) { fprintf(stderr,"[ERROR] pthread_create () :\n"); exit(EXIT_FAILURE); } } pthread_join(tid[0],NULL);//等待子线程结束,释放资源 pthread_join(tid[1],NULL); printf("global = %d\n",global); return 0; } 【图片】 加了互斥锁 #include #include #include #include //创建两个子线程,循环加法计算,使用互斥锁,静态初始化 static int global;//全局静态变量,临界资源 pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;//互斥锁静态初始化 v=1 void *do_thread(void *arg) { int i,tmp = 0; int loops = *(int *)arg; for(i = 0;i < loops;i++) { //访问临界资源global之前,获取互斥锁,v=1 ====> v=0 如果互斥锁没有被释放,会阻塞当前进程 pthread_mutex_lock(&mutex); tmp = global; tmp++; global = tmp; pthread_mutex_unlock(&mutex);//访问临界资源global之后,释放互斥锁,v=0 ====> v=1 } pthread_exit(NULL); } //"./a.out 100"===>两个子线程,对global,循环100次,进行 +1 //argv[0] = "./a.out " argv[1] = "100" int main(int argc,char *argv[])//argc:命令行参数个数 argv[]:保存命令行每个参数 { int err,i; pthread_t tid[2] = {0}; if (argc != 2) { fprintf(stderr,"Usage \n",argv[0]); exit(EXIT_FAILURE); } int loops = atoi(argv[1]);//將第二个命令行参数,转化为整数."100" ==> 100 for (i = 0;i < 2;i++) { err = pthread_create(&tid[i],NULL,do_thread,(void *)&loops); if (err != 0) { fprintf(stderr,"[ERROR] pthread_create () :\n"); exit(EXIT_FAILURE); } } pthread_join(tid[0],NULL);//等待子线程结束,释放资源 pthread_join(tid[1],NULL); printf("global = %d\n",global); return 0; } 【图片】




