网站建设与实现 文献综述内部网站建设教程

张小明 2026/1/8 19:34:50
网站建设与实现 文献综述,内部网站建设教程,asp网站建设实例花网站,谷歌seo快速排名软件首页一、为什么需要多线程#xff1f; 在现代计算机体系结构中#xff0c;多核处理器已成为标准配置。多线程编程允许我们充分利用这些计算资源#xff0c;通过并行执行任务来提升程序性能。C11之前#xff0c;多线程编程依赖于平台特定的API#xff08;如POSIX pthreads、Win…一、为什么需要多线程在现代计算机体系结构中多核处理器已成为标准配置。多线程编程允许我们充分利用这些计算资源通过并行执行任务来提升程序性能。C11之前多线程编程依赖于平台特定的API如POSIX pthreads、Windows线程APIC11标准引入了thread等头文件为多线程编程提供了统一、可移植的解决方案。二、C多线程基础2.1 第一个多线程程序#includeiostream#includethread#includechrono// 线程函数voidthreadFunction(intid){std::cout线程 id 开始执行std::endl;std::this_thread::sleep_for(std::chrono::seconds(1));std::cout线程 id 结束执行std::endl;}intmain(){std::cout主线程开始创建3个子线程std::endl;// 创建并启动线程std::threadt1(threadFunction,1);std::threadt2(threadFunction,2);std::threadt3(threadFunction,3);// 等待线程完成t1.join();t2.join();t3.join();std::cout所有线程执行完毕std::endl;return0;}2.2 线程管理的基本操作#includethread#includeiostreamvoidworker(){std::cout工作线程ID: std::this_thread::get_id()std::endl;}intmain(){// 获取硬件支持的并发线程数unsignedintnstd::thread::hardware_concurrency();std::cout硬件支持的最大并发线程数: nstd::endl;// 创建线程std::threadt(worker);// 线程IDstd::cout主线程ID: std::this_thread::get_id()std::endl;std::cout子线程ID: t.get_id()std::endl;// 检查线程是否可joinif(t.joinable()){t.join();// 等待线程完成}// 分离线程主线程不等待// t.detach(); // 谨慎使用return0;}三、数据共享与同步3.1 竞态条件与数据竞争#includeiostream#includethread#includevector// 有数据竞争的错误示例intcounter0;voidincrement(){for(inti0;i100000;i){counter;// 非原子操作存在数据竞争}}intmain(){std::threadt1(increment);std::threadt2(increment);t1.join();t2.join();// 结果可能不是200000std::cout计数器值: counterstd::endl;return0;}3.2 互斥锁Mutex#includeiostream#includethread#includemutex#includevectorintcounter0;std::mutex mtx;voidsafeIncrement(){for(inti0;i100000;i){std::lock_guardstd::mutexlock(mtx);// 自动加锁解锁counter;// lock_guard离开作用域自动释放锁}}voidtryLockExample(){std::timed_mutex timed_mtx;for(inti0;i5;i){// 尝试获取锁非阻塞if(timed_mtx.try_lock()){std::cout线程 std::this_thread::get_id() 获取到锁std::endl;std::this_thread::sleep_for(std::chrono::milliseconds(100));timed_mtx.unlock();break;}else{std::cout线程 std::this_thread::get_id() 未能获取锁等待重试std::endl;std::this_thread::sleep_for(std::chrono::milliseconds(50));}}}intmain(){std::threadt1(safeIncrement);std::threadt2(safeIncrement);t1.join();t2.join();std::cout安全的计数器值: counterstd::endl;// 尝试锁示例std::threadt3(tryLockExample);std::threadt4(tryLockExample);t3.join();t4.join();return0;}3.3 递归锁与锁保护#includeiostream#includethread#includemutexstd::recursive_mutex rec_mtx;voidrecursiveFunction(intdepth){if(depth0)return;rec_mtx.lock();std::cout深度: depth, 线程ID: std::this_thread::get_id()std::endl;// 递归调用使用递归锁避免死锁recursiveFunction(depth-1);rec_mtx.unlock();}// 使用unique_lock提供更灵活的锁管理voidflexibleLockExample(){std::mutex mtx;std::unique_lockstd::mutexlock(mtx,std::defer_lock);// 延迟锁定std::cout准备获取锁...std::endl;lock.lock();std::cout获取到锁执行临界区操作std::endl;lock.unlock();// 可以重新锁定lock.lock();std::cout重新锁定std::endl;// 自动解锁}intmain(){std::threadt1(recursiveFunction,3);std::threadt2(flexibleLockExample);t1.join();t2.join();return0;}3.4 条件变量#includeiostream#includethread#includemutex#includecondition_variable#includequeuestd::mutex mtx;std::condition_variable cv;std::queueintdataQueue;boolfinishedfalse;// 生产者线程voidproducer(intitems){for(inti0;iitems;i){std::this_thread::sleep_for(std::chrono::milliseconds(100));std::lock_guardstd::mutexlock(mtx);dataQueue.push(i);std::cout生产: istd::endl;cv.notify_one();// 通知一个等待的消费者}{std::lock_guardstd::mutexlock(mtx);finishedtrue;}cv.notify_all();// 通知所有消费者}// 消费者线程voidconsumer(intid){while(true){std::unique_lockstd::mutexlock(mtx);// 等待条件队列不为空或生产结束cv.wait(lock,[]{return!dataQueue.empty()||finished;});if(finisheddataQueue.empty()){break;}if(!dataQueue.empty()){intvaluedataQueue.front();dataQueue.pop();lock.unlock();// 提前解锁减少锁持有时间std::cout消费者 id 消费: valuestd::endl;}}std::cout消费者 id 结束std::endl;}intmain(){std::threadprod(producer,10);std::threadcons1(consumer,1);std::threadcons2(consumer,2);prod.join();cons1.join();cons2.join();return0;}四、原子操作4.1 原子类型#includeiostream#includethread#includeatomic#includevectorstd::atomicintatomicCounter(0);std::atomicboolready(false);voidatomicIncrement(){// 等待信号while(!ready.load(std::memory_order_acquire)){std::this_thread::yield();// 让出CPU时间片}for(inti0;i100000;i){atomicCounter.fetch_add(1,std::memory_order_relaxed);}}voidtestAtomicOperations(){std::atomicintvalue(10);// 原子操作示例intexpected10;boolsuccessvalue.compare_exchange_strong(expected,20);std::coutCAS操作: (success?成功:失败), 当前值: value.load()std::endl;// 原子标志测试std::atomic_flag flagATOMIC_FLAG_INIT;// 测试并设置boolwas_setflag.test_and_set();std::cout第一次test_and_set: was_setstd::endl;flag.clear();was_setflag.test_and_set();std::cout清除后test_and_set: was_setstd::endl;}intmain(){constintnum_threads4;std::vectorstd::threadthreads;// 启动线程for(inti0;inum_threads;i){threads.emplace_back(atomicIncrement);}// 让所有线程开始执行ready.store(true,std::memory_order_release);// 等待所有线程完成for(autot:threads){t.join();}std::cout原子计数器最终值: atomicCounter.load()std::endl;// 测试其他原子操作testAtomicOperations();return0;}4.2 内存顺序#includeatomic#includethread#includeiostreamstd::atomicintx(0),y(0);std::atomicintz(0);voidwrite_x_then_y(){x.store(1,std::memory_order_relaxed);// 1y.store(1,std::memory_order_release);// 2}voidread_y_then_x(){while(!y.load(std::memory_order_acquire));// 3if(x.load(std::memory_order_relaxed)){// 4z.fetch_add(1);}}voidmemoryOrderDemo(){std::threadt1(write_x_then_y);std::threadt2(read_y_then_x);t1.join();t2.join();// z应该为1std::coutz z.load()std::endl;}intmain(){// 多次运行观察结果for(inti0;i10;i){x0;y0;z0;memoryOrderDemo();}return0;}五、高级多线程模式5.1 线程池实现#includeiostream#includevector#includequeue#includethread#includemutex#includecondition_variable#includefunctional#includefuture#includememoryclassThreadPool{public:ThreadPool(size_t numThreads):stop(false){for(size_t i0;inumThreads;i){workers.emplace_back([this]{while(true){std::functionvoid()task;{std::unique_lockstd::mutexlock(queueMutex);condition.wait(lock,[this]{returnstop||!tasks.empty();});if(stoptasks.empty()){return;}taskstd::move(tasks.front());tasks.pop();}task();}});}}templateclassF,class...Argsautoenqueue(Ff,Args...args)-std::futuretypenamestd::result_ofF(Args...)::type{usingreturn_typetypenamestd::result_ofF(Args...)::type;autotaskstd::make_sharedstd::packaged_taskreturn_type()(std::bind(std::forwardF(f),std::forwardArgs(args)...));std::futurereturn_typerestask-get_future();{std::unique_lockstd::mutexlock(queueMutex);if(stop){throwstd::runtime_error(线程池已停止);}tasks.emplace([task](){(*task)();});}condition.notify_one();returnres;}~ThreadPool(){{std::unique_lockstd::mutexlock(queueMutex);stoptrue;}condition.notify_all();for(std::threadworker:workers){worker.join();}}private:std::vectorstd::threadworkers;std::queuestd::functionvoid()tasks;std::mutex queueMutex;std::condition_variable condition;boolstop;};// 使用示例intmain(){ThreadPoolpool(4);std::vectorstd::futureintresults;// 提交任务到线程池for(inti0;i8;i){results.emplace_back(pool.enqueue([i]{std::cout任务 i 在线程 std::this_thread::get_id() 执行std::endl;std::this_thread::sleep_for(std::chrono::seconds(1));returni*i;}));}// 获取结果for(autoresult:results){std::cout结果: result.get()std::endl;}return0;}5.2 读写锁C14及以上#includeiostream#includethread#includeshared_mutex#includevector#includechronoclassThreadSafeData{private:mutablestd::shared_mutex mutex_;intdata_;public:ThreadSafeData(intinit0):data_(init){}// 读取操作 - 共享锁intread()const{std::shared_lockstd::shared_mutexlock(mutex_);std::cout读取: data_ 线程ID: std::this_thread::get_id()std::endl;returndata_;}// 写入操作 - 独占锁voidwrite(intvalue){std::unique_lockstd::shared_mutexlock(mutex_);std::cout写入: value 线程ID: std::this_thread::get_id()std::endl;data_value;}// 增量操作voidincrement(){std::unique_lockstd::shared_mutexlock(mutex_);data_;std::cout增量到: data_ 线程ID: std::this_thread::get_id()std::endl;}};intmain(){ThreadSafeDatadata(0);std::vectorstd::threadthreads;// 创建5个读线程for(inti0;i5;i){threads.emplace_back([data,i]{for(intj0;j3;j){data.read();std::this_thread::sleep_for(std::chrono::milliseconds(100));}});}// 创建2个写线程for(inti0;i2;i){threads.emplace_back([data,i]{for(intj0;j2;j){data.write(i*10j);std::this_thread::sleep_for(std::chrono::milliseconds(200));}});}// 创建1个增量线程threads.emplace_back([data]{for(inti0;i4;i){data.increment();std::this_thread::sleep_for(std::chrono::milliseconds(150));}});// 等待所有线程完成for(autot:threads){t.join();}std::cout最终值: data.read()std::endl;return0;}六、C20新特性协程和信号量6.1 信号量C20#includeiostream#includethread#includesemaphore#includevector// 生产者-消费者模型使用信号量std::counting_semaphore10emptySlots(10);// 空槽位信号量std::counting_semaphore10fullSlots(0);// 满槽位信号量std::mutex bufferMutex;std::queueintbuffer;booldonefalse;voidproducer(intid){for(inti0;i5;i){emptySlots.acquire();// 等待空槽位{std::lock_guardstd::mutexlock(bufferMutex);buffer.push(i);std::cout生产者 id 生产: istd::endl;}fullSlots.release();// 增加满槽位std::this_thread::sleep_for(std::chrono::milliseconds(100));}}voidconsumer(intid){while(!done||!buffer.empty()){fullSlots.acquire();// 等待满槽位if(donebuffer.empty()){fullSlots.release();break;}intvalue;{std::lock_guardstd::mutexlock(bufferMutex);if(!buffer.empty()){valuebuffer.front();buffer.pop();std::cout消费者 id 消费: valuestd::endl;}}emptySlots.release();// 增加空槽位}}intmain(){constintnumProducers3;constintnumConsumers2;std::vectorstd::threadproducers;std::vectorstd::threadconsumers;// 启动生产者for(inti0;inumProducers;i){producers.emplace_back(producer,i);}// 启动消费者for(inti0;inumConsumers;i){consumers.emplace_back(consumer,i);}// 等待生产者完成for(autop:producers){p.join();}// 设置完成标志donetrue;// 释放所有信号量以唤醒等待的消费者for(inti0;inumConsumers;i){fullSlots.release();}// 等待消费者完成for(autoc:consumers){c.join();}std::cout生产消费完成std::endl;return0;}七、最佳实践与性能考虑7.1 避免死锁的准则#includeiostream#includethread#includemutex// 死锁示例std::mutex mtx1,mtx2;voiddeadlockThread1(){std::lock_guardstd::mutexlock1(mtx1);std::this_thread::sleep_for(std::chrono::milliseconds(100));std::lock_guardstd::mutexlock2(mtx2);// 可能死锁std::cout线程1完成std::endl;}voiddeadlockThread2(){std::lock_guardstd::mutexlock2(mtx2);std::this_thread::sleep_for(std::chrono::milliseconds(100));std::lock_guardstd::mutexlock1(mtx1);// 可能死锁std::cout线程2完成std::endl;}// 避免死锁的方法1按固定顺序加锁voidsafeThread1(){std::lock(mtx1,mtx2);// 同时锁定多个互斥量std::lock_guardstd::mutexlock1(mtx1,std::adopt_lock);std::lock_guardstd::mutexlock2(mtx2,std::adopt_lock);std::cout安全线程1完成std::endl;}voidsafeThread2(){std::lock(mtx1,mtx2);// 相同的锁定顺序std::lock_guardstd::mutexlock1(mtx1,std::adopt_lock);std::lock_guardstd::mutexlock2(mtx2,std::adopt_lock);std::cout安全线程2完成std::endl;}// 避免死锁的方法2使用std::scoped_lockC17voidscopedLockExample(){std::scoped_locklock(mtx1,mtx2);// 自动管理多个锁std::cout使用scoped_lock安全加锁std::endl;}intmain(){// 可能产生死锁// std::thread t1(deadlockThread1);// std::thread t2(deadlockThread2);// t1.join();// t2.join();// 安全版本std::threadt3(safeThread1);std::threadt4(safeThread2);t3.join();t4.join();// C17 scoped_lockstd::threadt5(scopedLockExample);t5.join();return0;}7.2 性能优化技巧#includeiostream#includethread#includeatomic#includevector#includechrono// 伪共享问题示例structBadAlignment{inta;// 可能和b在同一个缓存行intb;};// 解决伪共享structalignas(64)GoodAlignment{// 64字节对齐通常是缓存行大小inta;// 独占一个缓存行};structalignas(64)GoodAlignment2{intb;// 独占另一个缓存行};voidfalseSharingTest(){constintiterations100000000;// 伪共享情况BadAlignment bad;autostartstd::chrono::high_resolution_clock::now();std::threadt1([bad,iterations]{for(inti0;iiterations;i){bad.a;}});std::threadt2([bad,iterations]{for(inti0;iiterations;i){bad.b;}});t1.join();t2.join();autoendstd::chrono::high_resolution_clock::now();autodurationstd::chrono::duration_caststd::chrono::milliseconds(end-start);std::cout伪共享耗时: duration.count()msstd::endl;// 避免伪共享GoodAlignment good1;GoodAlignment2 good2;startstd::chrono::high_resolution_clock::now();std::threadt3([good1,iterations]{for(inti0;iiterations;i){good1.a;}});std::threadt4([good2,iterations]{for(inti0;iiterations;i){good2.b;}});t3.join();t4.join();endstd::chrono::high_resolution_clock::now();durationstd::chrono::duration_caststd::chrono::milliseconds(end-start);std::cout避免伪共享耗时: duration.count()msstd::endl;}intmain(){falseSharingTest();return0;}八、调试与测试8.1 线程安全的单元测试#includeiostream#includethread#includevector#includecassert#includefutureclassThreadSafeCounter{private:std::mutex mtx;intcount;public:ThreadSafeCounter():count(0){}voidincrement(){std::lock_guardstd::mutexlock(mtx);count;}intget()const{std::lock_guardstd::mutexlock(mtx);returncount;}};voidtestThreadSafety(){ThreadSafeCounter counter;constintnumThreads10;constintincrementsPerThread1000;std::vectorstd::futurevoidfutures;// 启动多个线程同时增加计数器for(inti0;inumThreads;i){futures.emplace_back(std::async(std::launch::async,[counter,incrementsPerThread]{for(intj0;jincrementsPerThread;j){counter.increment();}}));}// 等待所有线程完成for(autofuture:futures){future.wait();}// 验证结果intexpectednumThreads*incrementsPerThread;intactualcounter.get();std::cout期望值: expectedstd::endl;std::cout实际值: actualstd::endl;assert(actualexpected);std::cout测试通过std::endl;}intmain(){try{testThreadSafety();}catch(conststd::exceptione){std::cerr测试失败: e.what()std::endl;return1;}return0;}九、总结与进阶学习9.1 关键点总结线程创建与管理使用std::thread创建线程理解join和detach的区别数据同步掌握互斥锁、条件变量、原子操作的使用场景避免常见问题识别和避免死锁、竞态条件、伪共享性能优化合理选择同步机制减少锁竞争现代C特性利用C14/17/20的新特性简化多线程编程9.2 进阶学习方向并行算法C17的并行STL算法GPU编程CUDA、OpenCL、SYCL分布式计算MPI、gRPC、ZeroMQ异步编程模型Promise/Future、反应式编程并发数据结构无锁队列、并发哈希表9.3 推荐工具调试工具ThreadSanitizer、Helgrind、Intel Inspector性能分析Perf、VTune、AMD uProf可视化Chrome Tracing、Vampir多线程编程是C高级开发的核心技能之一。从基础同步机制到高级并发模式需要不断实践和积累经验。记住过早优化是万恶之源在确保正确性的前提下进行性能优化使用工具验证线程安全性编写可维护的并发代码。
版权声明:本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!

网站建设一二级目录网站推广公司排行榜

文章目录 摘要 本教程将详细讲解如何从零开始构建一个完整的、可落地的智能家居温湿度监测系统。我们将使用ESP32作为核心微控制器,DHT11传感器采集环境数据,通过Wi-Fi将数据上传至物联网平台(ThingSpeak),并最终在Web…

张小明 2026/1/8 1:04:16 网站建设

私人订制网站有哪些如何做网站打广告

LocalAI本地AI平台构建指南:从零打造专属智能助手 【免费下载链接】LocalAI 项目地址: https://gitcode.com/gh_mirrors/loc/LocalAI 想要在个人设备上拥有强大的AI助手,却担心复杂的配置流程?LocalAI开源项目为您提供了完美的解决方…

张小明 2026/1/8 1:04:17 网站建设

广州天美展览公司网站网站前端跟后端怎么做

重新定义视频生成:Stability AI引领的时空建模革命 【免费下载链接】generative-models 是由Stability AI研发的生成模型技术 项目地址: https://gitcode.com/GitHub_Trending/ge/generative-models 当静态图像向动态视频的转化仍受限于帧率瓶颈时&#xff0…

张小明 2026/1/8 1:04:18 网站建设

网站建设08keji泉州网站制作设计

NSC_BUILDER(Nintendo Switch Cleaner and Builder)是一款专为Nintendo Switch平台设计的全能文件管理工具,被誉为"Switch玩家的多功能工具"。这款开源工具基于hacbuild和Nut Python库开发,最初用于移除NSP文件的标题加…

张小明 2026/1/8 1:04:22 网站建设

网站后台更新的内容出不来做网站是怎么做的

内核可调参数、开关和限制详解 在操作系统的运行过程中,内核参数的调整对于系统性能的优化和资源的合理分配至关重要。本文将详细介绍内核的各种可调参数、开关和限制,帮助你更好地理解和管理系统。 1. 内核参数概述 内核参数是可以在系统中进行设置的变量,这些变量的值存…

张小明 2026/1/8 1:04:23 网站建设