
作业社区
探索学习新天地,共享知识资源!
weixin_慕哥3021856 的学生作业:
space.h #ifndef __SPACE_H_ #define __SPACE_H_ namespace A_space { extern int calc(int a, int b); } namespace B_space { extern int calc(int a, int b); } #endif a.cpp #include "space.h" namespace A_space { int calc(int a, int b) { return a + b; } } b.cpp #include "space.h" namespace B_space { int calc(int a, int b) { return a - b; } } main.cpp #include #include "space.h" int main() { int n1 = 60; int n2 = 10; std::cout





胡汉三66 的学生作业:
#include #include #include #include #include #include //实现多个生产者(子线程)+多个消费者(子线程)模型,并解决代码中线程资源的释放 //"./a.out 1 2 3 1 2 3":前三个是生产线程,共生产6个产品.后3个是消费线程,共消费6个产品 //释放资源方法,一是分离子线程用pthread_detach()函数,二是等待子线程结束,用pthread_join()函数.有详细代码标记 static int number;//共享资源,记录总共生产的产品 static int control_to_consume = 0;//定义总共消费的产品数 static pthread_mutex_t mtx = PTHREAD_MUTEX_INITIALIZER;//互斥锁,静态初始化 static pthread_cond_t cond = PTHREAD_COND_INITIALIZER;//条件变量,静态初始化 //子线程,生产者 void *thread_handler_produce(void *arg) { 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_cond_broadcast(&cond);//发送 条件变量信号 唤醒所有阻塞 消费子线程,消费子线程 执行不同的任务 } pthread_exit((void *)0); } //子线程,消费者 void *thread_handler_consume(void *arg) { int i = 0; int cns = atoi((char*)arg);//将字符串参数 转变为 整数 pthread_mutex_lock(&mtx);//获得互斥锁 while(number == 0)// 仓库没有产品, 阻塞函数.while()函数,是 应对 可能的 多个消费线程时. { pthread_cond_wait(&cond,&mtx);//1.互斥锁解锁 2.阻塞函数 3.等待 条件变量信号 唤醒函数 4.唤醒后,重新竞争互斥锁 } for(i = 0;i < cns && number > 0;i++) { control_to_consume++;//消费一个产品 printf("消费子线程 消费 一个产品,现在有 %d 个产品\n",pthread_self(),--number); sleep(1); } if(number > 0) { pthread_cond_broadcast(&cond); //唤醒其他可能在等待的消费者 } 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;//定义总共生产的产品数 if (argc != 7) { fprintf(stderr,"Usage : < %s > ",argv[0]); exit(EXIT_FAILURE); } //创建 生产者 线程 for(i = 1;i < (argc - 3);i++) { control_to_produce += atoi((char *)argv[i]);//统计总共生产的产品 err = pthread_create(&tid[i],NULL,thread_handler_produce,(void *)argv[i]);//创建子线程 if (err != 0) { fprintf(stderr,"[ERROR] pthread_create ():\n",strerror(err)); exit(EXIT_FAILURE); } printf("创建 生产者 线程 \n",tid[i]); pthread_detach(tid[i]);//使子线程分离,等线程结束后,操作系统自动回收资源 } //创建 消费者 线程 for(i = (argc - 3);i < argc;i++) { err = pthread_create(&tid[i],NULL,thread_handler_consume,(void *)argv[i]);//创建子线程 if (err != 0) { fprintf(stderr,"[ERROR] pthread_create ():\n",strerror(err)); exit(EXIT_FAILURE); } printf("创建 消费者 线程 \n",tid[i]); pthread_detach(tid[i]);//使子线程分离,等线程结束后,操作系统自动回收资源 } //判断程序是否结束 for(;;) { if(control_to_consume >= control_to_produce) //判断 总消费数 是否大于等于 总生产数 { break; } } return 0; } 【图片】




