大人怎么做羞羞的网站视频网站哪个做的好处

张小明 2026/1/19 17:22:04
大人怎么做羞羞的网站,视频网站哪个做的好处,wordpress添加自动关键词内链,文昌湖城乡建设局网站1.实验目的1.掌握线程的概念及创建方法2.掌握线程互斥锁及条件变量同步机制3.掌握POSIX信号量机制4.掌握生产者消费者原理5.设计程序#xff0c;两种方法实现多线程生产者消费者同步问题2.实验截图及结果分析#xff08;1#xff09;实验截图#xff08;2#xff09;实验结…1.实验目的1.掌握线程的概念及创建方法2.掌握线程互斥锁及条件变量同步机制3.掌握POSIX信号量机制4.掌握生产者消费者原理5.设计程序两种方法实现多线程生产者消费者同步问题2.实验截图及结果分析1实验截图2实验结果分析本次实验通过使用条件变量和互斥锁以及Posix信号量两种方式实现生产者消费者同步问题实验结果展示了程序在多线程环境下数据的正确生产与消费体现了线程同步机制的有效性。①条件变量和互斥锁实现方式数据生产与消费顺序从实验截图的输出结果来看生产者1和生产者2交替向缓冲区写入数据且写入位置和值符合预期。消费者1和消费者2也能按顺序从缓冲区读取数据每次读取的数据值与生产者写入的值一致这表明在条件变量和互斥锁的同步机制下生产者和消费者线程之间的协作正常数据的读写顺序正确没有出现数据竞争或混乱的情况。缓冲区满与空的处理当缓冲区满时生产者线程会根据条件判断进入阻塞等待状态直到消费者从缓冲区取出数据通过条件变量notfull唤醒生产者线程继续写入数据当缓冲区空时消费者线程会通过条件变量notempty等待直到生产者写入数据后被唤醒读取数据。这说明条件变量和互斥锁有效地控制了缓冲区的状态避免了缓冲区溢出和下溢的问题保证了数据的安全性和完整性。线程执行频率在生产者1和生产者2以及消费者1和消费者2的代码中均设置了每次操作后休眠1秒的机制这使得线程的执行频率得到了有效控制输出结果清晰有序便于观察和分析线程的执行过程。② Posix信号量实现方式奇偶数据生产控制生产者1按照预期只生产奇数生产者2只生产偶数这表明通过对n的奇偶判断以及信号量的同步机制成功实现了对生产者生产数据的约束保证了数据生产的正确性和特定性。信号量同步效果Posix信号量mutex、empty和full在控制线程同步方面发挥了重要作用。empty信号量控制了生产者向缓冲区写入数据的时机只有当empty信号量的值大于0时生产者才能写入数据从而避免了缓冲区满时的写入操作full信号量控制了消费者从缓冲区读取数据的时机当full信号量的值大于0时消费者才能读取数据防止了缓冲区空时的读取操作mutex信号量则保证了对缓冲区的访问是线程安全的避免了多个线程同时访问缓冲区导致的数据错误。线程协作稳定性与条件变量和互斥锁实现方式类似通过设置线程每次操作后的休眠时间使得线程的执行过程清晰可见。在整个实验过程中生产者和消费者线程能够稳定协作没有出现线程死锁或数据错误的情况证明了Posix信号量在解决生产者消费者同步问题上的可靠性。③ 两种实现方式的对比条件变量和互斥锁以及Posix信号量都能有效地解决生产者消费者同步问题但在实现细节和适用场景上存在一定差异。条件变量和互斥锁的组合使用通过对条件的判断和等待机制更侧重于线程之间的条件同步而Posix信号量则通过对信号量值的操作来控制线程的执行更侧重于资源的计数和控制。在实际应用中可根据具体需求和场景选择合适的同步机制。3.实验程序1采用条件变量和互斥锁解决生产者消费者问题prodcons.c#include stdio.h #include pthread.h #include unistd.h // 为了使用 sleep 函数 #define BUFSIZE 8 int n 1, m 1; struct prodcons { int buffer[BUFSIZE]; pthread_mutex_t lock; // 互斥LOCK int readpos, writepos; pthread_cond_t notempty; // 缓冲区非空条件判断 pthread_cond_t notfull; // 缓冲区未满条件判断 }; void init(struct prodcons *b) { pthread_mutex_init(b-lock, NULL); pthread_cond_init(b-notempty, NULL); pthread_cond_init(b-notfull, NULL); b-readpos 0; b-writepos 0; } struct prodcons buffer; void *producer1(void *data) { while (1) { if (buffer.writepos % 2 0) { pthread_mutex_lock((buffer.lock)); // 等待缓冲区未满 if ((buffer.writepos 1) % BUFSIZE buffer.readpos) { // 缓冲区满,生产者将被挂起,直至重新被唤醒 pthread_cond_wait((buffer.notfull), (buffer.lock)); } // 写数据,并移动指针 printf( ); printf(producer1 start putting: put position is %d, put value is %d\n, buffer.writepos, n); buffer.buffer[buffer.writepos] n; buffer.writepos; if (buffer.writepos BUFSIZE) buffer.writepos 0; // 设置缓冲区非空的条件变量 pthread_cond_signal((buffer.notempty)); pthread_mutex_unlock((buffer.lock)); n; } sleep(1); // 生产者1每次操作后休眠1秒 } } void *producer2(void *data) { while (1) { if (buffer.writepos % 2 ! 0) { pthread_mutex_lock((buffer.lock)); // 等待缓冲区未满 if ((buffer.writepos 1) % BUFSIZE buffer.readpos) { // 缓冲区满,生产者将被挂起,直至重新被唤醒 pthread_cond_wait((buffer.notfull), (buffer.lock)); } // 写数据,并移动指针 printf( ); printf(producer2 start putting: put position is %d, put value is %d\n, buffer.writepos, n); buffer.buffer[buffer.writepos] n; buffer.writepos; if (buffer.writepos BUFSIZE) buffer.writepos 0; // 设置缓冲区非空的条件变量 pthread_cond_signal((buffer.notempty)); pthread_mutex_unlock((buffer.lock)); n; } sleep(1); // 生产者2每次操作后休眠1秒 } } void *consumer1(void *data) { int d; while (1) { pthread_mutex_lock((buffer.lock)); if (buffer.writepos buffer.readpos) { // 等待缓冲区非空 pthread_cond_wait((buffer.notempty), (buffer.lock)); } // 读数据,移动读指针 d buffer.buffer[buffer.readpos]; printf(first consumer: get position is %d, get value is %d\n, buffer.readpos, d); buffer.readpos; if (buffer.readpos BUFSIZE) buffer.readpos 0; // 设置缓冲区未满的条件变量 pthread_cond_signal((buffer.notfull)); pthread_mutex_unlock((buffer.lock)); sleep(1); // 消费者1每次操作后休眠1秒 } return NULL; } void *consumer2(void *data) { int d; while (1) { pthread_mutex_lock((buffer.lock)); if (buffer.writepos buffer.readpos) { // 等待缓冲区非空 pthread_cond_wait((buffer.notempty), (buffer.lock)); } // 读数据,移动读指针 d buffer.buffer[buffer.readpos]; printf(second consumer: get position is %d, get value is %d\n, buffer.readpos, d); buffer.readpos; if (buffer.readpos BUFSIZE) buffer.readpos 0; // 设置缓冲区未满的条件变量 pthread_cond_signal((buffer.notfull)); pthread_mutex_unlock((buffer.lock)); sleep(1); // 消费者2每次操作后休眠1秒 } return NULL; } int main(void) { pthread_t th_a, th_b, th_c, th_d; void *retval; init(buffer); pthread_create(th_a, NULL, producer1, 0); pthread_create(th_b, NULL, producer2, 0); pthread_create(th_c, NULL, consumer1, 0); pthread_create(th_d, NULL, consumer2, 0); pthread_join(th_a, retval); pthread_join(th_b, retval); pthread_join(th_c, retval); pthread_join(th_d, retval); return 0; }2使用Posix信号量解决生产者消费者问题prodcons-semwait.c#include stdio.h #include stdlib.h #include time.h #include sys/types.h #include pthread.h #include semaphore.h #include string.h #include unistd.h #define BUFSIZE 8 sem_t mutex, empty, full; int n 1, m 1; struct prodcons { int buffer[BUFSIZE]; int readpos, writepos; }; void init(struct prodcons *b) { b-readpos 0; b-writepos 0; } struct prodcons buffer; // producer1 只生产奇数 void *producer1(void *arg) { while (1) { if (n % 2 ! 0) { sem_wait(empty); sem_wait(mutex); printf(producer1 is putting: put pos is %d, put %d\n, buffer.writepos, n); buffer.buffer[buffer.writepos] n; buffer.writepos; if (buffer.writepos BUFSIZE) { buffer.writepos 0; } n; sem_post(mutex); sem_post(full); } sleep(1); // 控制生产速度 } return NULL; } // producer2 只生产偶数 void *producer2(void *arg) { while (1) { if (n % 2 0) { sem_wait(empty); sem_wait(mutex); printf(producer2 is putting: put pos is %d, put %d\n, buffer.writepos, n); buffer.buffer[buffer.writepos] n; buffer.writepos; if (buffer.writepos BUFSIZE) { buffer.writepos 0; } n; sem_post(mutex); sem_post(full); } sleep(1); // 控制生产速度 } return NULL; } void *consumer1(void *arg) { int data; while (1) { sem_wait(full); sem_wait(mutex); data buffer.buffer[buffer.readpos]; printf(consumer1 is getting: get pos is %d, get %d\n, buffer.readpos, data); buffer.readpos; if (buffer.readpos BUFSIZE) { buffer.readpos 0; } sleep(1); // 控制消费速度 sem_post(mutex); sem_post(empty); } return NULL; } void *consumer2(void *arg) { int data; while (1) { sem_wait(full); sem_wait(mutex); data buffer.buffer[buffer.readpos]; printf(consumer2 is getting: get pos is %d, get %d\n, buffer.readpos, data); buffer.readpos; if (buffer.readpos BUFSIZE) { buffer.readpos 0; } sleep(1); // 控制消费速度 sem_post(mutex); sem_post(empty); } return NULL; } int main(void) { pthread_t th_a, th_b, th_c, th_d; void *retval; init(buffer); sem_init(mutex, 0, 1); sem_init(empty, 0, 8); sem_init(full, 0, 0); pthread_create(th_a, NULL, producer1, NULL); pthread_create(th_b, NULL, producer2, NULL); pthread_create(th_c, NULL, consumer1, NULL); pthread_create(th_d, NULL, consumer2, NULL); pthread_join(th_a, retval); pthread_join(th_b, retval); pthread_join(th_c, retval); pthread_join(th_d, retval); sem_destroy(mutex); sem_destroy(empty); sem_destroy(full); return 0; }
版权声明:本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!

网站验证码是如何做的cerntos wordpress

目录具体实现截图项目介绍论文大纲核心代码部分展示可定制开发之亮点部门介绍结论源码获取详细视频演示 :文章底部获取博主联系方式!同行可合作具体实现截图 本系统(程序源码数据库调试部署讲解)同时还支持Python(flask,django)、…

张小明 2026/1/17 18:17:51 网站建设

怎么设置网站权限西安网页设计培训排名

PyTorch-CUDA-v2.8镜像适合初学者吗?零基础也能快速上手 在深度学习的世界里,最让人望而却步的往往不是复杂的神经网络结构,也不是晦涩难懂的反向传播原理——而是还没开始写代码,就已经被环境配置卡住。你是否也经历过这样的场景…

张小明 2026/1/17 18:17:51 网站建设

icp备案系统网站网络营销与直播电商是做什么的

macOS开源应用终极指南:免费工具集合实现效率飞跃 【免费下载链接】open-source-mac-os-apps serhii-londar/open-source-mac-os-apps: 是一个收集了众多开源 macOS 应用程序的仓库,这些应用程序涉及到各种领域,例如编程、生产力工具、游戏等…

张小明 2026/1/17 18:17:52 网站建设

刚做的网站为什么百度搜不出来平面设计软件ps

在智能通话设备日益普及的今天,回音干扰、环境噪音嘈杂、集成适配复杂等问题,成为制约音频交互体验的核心痛点。无论是智能家居对讲、车载通话,还是安防监控、远程会议,用户都迫切需要一款能快速集成、性能稳定的语音处理解决方案…

张小明 2026/1/17 18:17:53 网站建设

做淘宝网站买个模版可以吗门户网站指的是什么

轻量级多模态模型推荐:Qwen3-VL-8B在电商图像分析中的应用当你在电商平台上传一张连衣裙的照片,系统不仅能自动识别出“白色”“蕾丝”“V领”等属性,还能生成一段流畅的文案:“适合春夏季约会场合,优雅又不失清爽”&a…

张小明 2026/1/17 18:17:54 网站建设

石狮市网站建设wordpress 目录 导航站

基于GPT-SoVITS的情感化语音合成探索 在虚拟主播直播带货、AI配音生成短视频内容的今天,我们越来越难分辨一段声音是来自真人还是人工智能。不是因为技术藏得深,而是它已经足够自然——语气有起伏,情绪能传递,甚至连方言口音都能惟…

张小明 2026/1/17 18:17:56 网站建设