当前位置: 首页 > news >正文

许昌网站建设汉狮怎么样济南科技市场做网站

许昌网站建设汉狮怎么样,济南科技市场做网站,教做凉拌菜的视频网站,移动端app开发公司1 生产者-消费者模型 生产者-消费者模型是一种多线程协作的设计模式#xff0c;它主要用于处理生产数据和消费数据的过程。在这个模型中#xff0c;存在两类线程#xff1a;生产者线程和消费者线程。生产者线程负责生产数据#xff0c;并将其放入一个共享的数据缓冲区它主要用于处理生产数据和消费数据的过程。在这个模型中存在两类线程生产者线程和消费者线程。生产者线程负责生产数据并将其放入一个共享的数据缓冲区通常是一个队列。消费者线程则从该数据缓冲区中取出数据进行处理。这种模型的核心在于确保生产者和消费者之间的同步和互斥以防止数据丢失或重复处理。 生产者-消费者模型的适用场景 生产者-消费者模型广泛适用于需要处理并发数据流的场景其中数据的生成和处理速度可能不同。以下是几个具体的应用场景 线程池 在实现线程池的技术点中任务队列就是一个典型的生产者-消费者模型的应用。当线程池繁忙时新提交的任务会被放入任务队列相当于数据缓冲区等待处理。一旦有线程空闲出来它会从队列中取出任务进行处理。 网络编程 在生产者-消费者模型中生产者可以代表网络数据的接收方将接收到的数据放入缓冲区而消费者可以代表数据的处理方从缓冲区中取出数据进行处理。这种模型可以有效地处理网络延迟和数据流的不稳定性。 数据库操作 在数据库操作中生产者可以代表数据的写入操作将数据写入数据库消费者可以代表数据的读取操作从数据库中读取数据进行处理。生产者-消费者模型可以有效地处理数据库的读写并发问题。 文件操作 在处理大文件或数据流时生产者可以代表数据的读取操作将读取的数据放入缓冲区消费者可以代表数据的处理操作从缓冲区中取出数据进行处理。这种模型可以有效地提高文件处理的效率。 在 C11 中可以使用 thread, mutex, condition_variable 和 queue 等库来实现生产者-消费者模型。如下为样例代码 #include iostream #include thread #include vector #include queue #include mutex #include condition_variable std::queueint g_datas; // 全局生产产品 int g_dataIndex 0; // 全局生产产品的编号std::mutex g_mutex; std::condition_variable g_cv;const int MAX_NUM 3; // 一次生产产品的数量void producer(int id) {for (int i 0; i MAX_NUM; i){std::unique_lockstd::mutex lock(g_mutex);g_datas.push(g_dataIndex);printf(producer %d produced item : %d\n, id, g_dataIndex);g_dataIndex;g_cv.notify_one();lock.unlock();std::this_thread::yield(); // 计算机核数较多并且性能较好的情况下该语句可以不用加这样生产者-消费者的整体效率更高。}// 通知生产结束 g_cv.notify_all(); }void consumer() {while (true) {std::unique_lockstd::mutex lock(g_mutex);g_cv.wait(lock, [] { return !g_datas.empty(); });int data g_datas.front();g_datas.pop();printf(consumer consumed item : %d\n, data);} }int main() {std::vectorstd::thread producers;std::thread consumerThread(consumer);// 创建生产者线程 for (int i 0; i 3; i){producers.emplace_back(producer, i);}// 等待生产结束for (auto t : producers){t.join();}consumerThread.join();return 0; }上面代码的输出为 producer 0 produced item : 0 consumer consumed item : 0 producer 0 produced item : 1 producer 0 produced item : 2 consumer consumed item : 1 consumer consumed item : 2 producer 2 produced item : 3 producer 2 produced item : 4 consumer consumed item : 3 consumer consumed item : 4 producer 1 produced item : 5 producer 2 produced item : 6 consumer consumed item : 5 consumer consumed item : 6 producer 1 produced item : 7 consumer consumed item : 7 producer 1 produced item : 8 consumer consumed item : 8在上面代码中创建了多个生产者线程和一个消费者线程。每个生产者线程都按照产品序列号进行产品生产并将其推送到共享队列 g_datas 中。消费者线程则等待队列中有元素可用时从中取出元素并处理。当所有生产者线程完成生产后它们通过 g_cv.notify_all(); 通知消费者线程来结束生产。 注意以下几点 使用 std::mutex 来保护共享队列 g_datas 的访问确保同一时间只有一个线程可以修改它。 使用 std::condition_variable 来在队列为空时阻塞消费者线程直到有生产者线程向队列中添加新元素。 std::unique_lock 与 std::lock_guard 类似但提供了更多的灵活性如手动解锁和条件等待。 std::this_thread::yield() 用于让出CPU时间片使其他线程有机会运行。但是在计算机核数较多并且性能较好的情况下该语句可以不用加这样生产者-消费者的整体效率更高。 这个模型可以扩展为多个消费者线程只需创建更多的消费者线程实例即可。在实际应用中可能还需要考虑其他因素如队列的大小限制、线程的同步问题、以及优雅地处理线程的启动和停止等。 2 线程池 线程池是一种在并发编程中常用的技术它用于管理和重用线程。线程池的基本思想是在应用程序启动时创建一定数量的线程并将它们保存在一个线程池中。当需要执行任务时从线程池中获取一个空闲的线程来执行该任务。当任务执行完毕后线程将返回到线程池以供其他任务复用。线程池的设计目标是避免频繁地创建和销毁线程所带来的开销以及控制并发执行的线程数量从而提高系统的性能和资源利用率。 线程池通常包含以下几个关键组成部分 线程池管理器 负责创建、管理和控制线程池。它负责线程的创建、销毁和管理以及线程池的状态监控和调度任务。 工作队列 用于存储待执行的任务。当线程池中的线程都在执行任务时新的任务会被放入工作队列中等待执行。 线程池线程 实际执行任务的线程。线程池中会维护一组线程这些线程可以被重复使用从而避免了频繁创建和销毁线程的开销。 线程池的运行机制如下当任务到达时线程池管理器会检查线程池中是否有空闲的线程。如果有则将任务分配给空闲线程执行如果没有则根据线程池的配置来决定是创建一个新线程还是将任务放入工作队列中等待执行。当线程池中的线程执行完任务后会从工作队列中获取下一个任务并执行。 线程池适用于以下场景 任务量巨大且单个任务执行时间较短 当有大量任务需要执行且每个任务的执行时间相对较短时使用线程池可以显著提高程序的执行效率。线程池可以避免频繁地创建和销毁线程减少资源消耗。 需要控制并发度 线程池可以限制并发执行的线程数量防止系统过载。通过调整线程池的大小可以控制并发度避免资源消耗过大。 提供线程管理和监控 线程池提供了一些管理和监控机制例如线程池的创建、销毁、线程状态的监控等方便开发人员进行线程的管理和调试。 总体而言线程池是一种高效、灵活的并发编程技术适用于多种场景。通过合理地配置线程池的大小和任务队列的容量可以充分利用系统资源提高程序的性能和响应速度。 在 C11 中可以使用 thread, mutex, condition_variable 和 queue 等库来实现线程池。如下为样例代码 #include iostream #include vector #include queue #include thread #include mutex #include condition_variable #include functional #include future class ThreadPool { public:ThreadPool(size_t);templateclass F, class... Argsauto enqueue(F f, Args... args)-std::futuretypename std::result_ofF(Args...)::type;~ThreadPool(); private:// 需要保持线程活动的标记 std::vector std::thread workers;// 任务队列 std::queue std::functionvoid() tasks;// 同步 std::mutex queueMutex;std::condition_variable condition;bool stop; };// 构造函数 inline ThreadPool::ThreadPool(size_t num): stop(false) {for (size_t i 0; i num; i){workers.emplace_back([this] {while (true){std::functionvoid() task;{std::unique_lockstd::mutex lock(this-queueMutex);this-condition.wait(lock,[this] { return this-stop || !this-tasks.empty(); });if (this-stop this-tasks.empty()){return;}task std::move(this-tasks.front());this-tasks.pop();}task();}});} }// 添加新工作项到线程池 templateclass F, class... Args auto ThreadPool::enqueue(F f, Args... args) - std::futuretypename std::result_ofF(Args...)::type {using return_type typename std::result_ofF(Args...)::type;auto task std::make_shared std::packaged_taskreturn_type() (std::bind(std::forwardF(f), std::forwardArgs(args)...));std::futurereturn_type res task-get_future();{std::unique_lockstd::mutex lock(queueMutex);// 不允许在停止后添加任务 if (stop) {throw std::runtime_error(enqueue on stopped ThreadPool);}tasks.emplace([task]() { (*task)(); });}condition.notify_one();return res; }// 析构函数 inline ThreadPool::~ThreadPool() {{std::unique_lockstd::mutex lock(queueMutex);stop true;}condition.notify_all();for (std::thread worker : workers) {worker.join();} }// 使用线程池的例子 void doSomething(int n) {printf(doing something with %d\n,n);std::this_thread::sleep_for(std::chrono::seconds(1)); }int main() {ThreadPool pool(4);// 添加任务到线程池 auto fut1 pool.enqueue(doSomething, 1);auto fut2 pool.enqueue(doSomething, 2);auto fut3 pool.enqueue(doSomething, 3);auto fut4 pool.enqueue(doSomething, 4);// 等待所有任务完成 fut1.get();fut2.get();fut3.get();fut4.get();return 0; }上面代码的输出为 doing something with 1 doing something with 2 doing something with 3 doing something with 4上面代码中的 enqueue 函数是是线程池的核心它接受一个可调用对象函数、 Lambda 表达式等和一组参数并将它们封装到一个 std::packaged_task 对象中。 std::packaged_task 是一个模板类它接受一个可调用对象并将其包装成一个任务这个任务可以异步执行并且可以在将来某个时间点获取其结果。 一旦任务被封装它就被添加到线程池的任务队列中。然后通过调用condition.notify_one()来唤醒一个等待在条件变量上的线程如果有的话。这个被唤醒的线程会从队列中取出任务并执行它。 enqueue 函数返回一个 std::future 对象这个对象代表了异步任务的结果。调用者可以通过这个 std::future 对象来获取任务的结果或者等待任务完成。 在main函数中首先创建了一个包含 4 个线程的线程池。然后向线程池添加了 4 个任务每个任务都调用 doSomething 函数并传入一个不同的参数。每个任务都返回一个 std::future 对象我们可以通过这些对象来等待任务完成并获取结果。 最后通过调用 get() 方法来等待每个任务完成并获取其结果。因为 doSomething 函数没有返回任何值所以 get() 方法在这里实际上没有做任何事情。如果 doSomething 函数返回了一个值那么get()方法会返回这个值。 3 定时器 定时器是一个可以设定在某一特定时间点触发某个操作或事件的系统工具。它可以基于时间周期来执行任务或者在某些特定时间间隔后执行某个操作。定时器的主要作用是产生一个时基即从某一时刻开始经过一段指定的时间触发一个中断或超时回调事件可以在中断或者超时回调函数中处理数据。 定时器的适用场景非常广泛如下是几种常见的用途 嵌入式系统 在嵌入式系统中定时器是一个基础服务如 RTOS 实时操作系统就需要依赖定时器提供时钟节拍以实现线程延时、线程时间片轮询调度等。 操作系统 在操作系统中定时器用于实现各种定时任务如定时清理缓存、定时检查系统资源使用情况等。 网络编程 在网络编程中定时器常用于实现超时控制如TCP连接超时、请求超时等。 任务调度 在任务调度系统中定时器可以用于按照预设的时间间隔执行某些任务如每日的数据统计、报告生成等。 在 C11 中可以使用 thread, mutex, condition_variable 和 queue 等库来实现线程池。如下为样例代码 #include iostream #include thread #include chrono #include atomic #include mutex #include condition_variable #include functional class Timer { public:Timer() : expired(true), tryToExpire(false) {}void start(uint64_t interval, std::functionvoid() task){if (expired false) {// 上一个定时器还在运行, 设置一个标志让线程尽快结束当前等待并退出 tryToExpire true;// 等待线程结束 if (thread.joinable()){thread.join();}}expired false;tryToExpire false;// 保存任务和间隔时间 this-task task;this-interval std::chrono::milliseconds(interval);// 启动定时器线程 thread std::thread([this]() {while (!expired) {std::unique_lockstd::mutex lock(this-mtx);// 检查是否需要尽快结束等待 if (tryToExpire){// 通过notify_all唤醒可能在等待的线程并立即返回 this-cv.notify_all();continue;}// 等待定时器到期或收到退出通知 this-cv.wait_for(lock, this-interval, [this]() { return this-expired || this-tryToExpire; });// 检查定时器是否仍然有效 if (!expired) {// 执行任务 this-task();}}});// 分离线程这样当线程结束时会自动释放资源 thread.detach();}void stop() {// 设置定时器到期标志 expired true;tryToExpire true;// 唤醒可能在等待的线程 cv.notify_all();// 如果线程是可连接的则等待它结束 if (thread.joinable()) {thread.join();}}~Timer() {stop();}private:std::atomicbool expired;std::atomicbool tryToExpire;std::thread thread;std::functionvoid() task;std::chrono::milliseconds interval;std::mutex mtx;std::condition_variable cv; };// 使用示例 int main() {Timer timer;timer.start(1000, []() {printf(timer task executed!\n);});std::this_thread::sleep_for(std::chrono::milliseconds(4200));printf(main thread waking up...\n);// 停止定时器 timer.stop();return 0; }上面代码的输出为 timer task executed! timer task executed! timer task executed! timer task executed! main thread waking up...上面代码中的 Timer 类使用一个内部线程来周期性地执行任务。当调用 start 方法时它会启动一个线程该线程将等待指定的时间间隔然后执行任务。如果定时器正在运行并且再次调用 start 则会尝试停止当前线程并启动一个新的线程。调用 stop 方法会设置标志来通知线程退出循环并结束执行。 注意这个简单的定时器实现可能不适用于所有场景特别是需要高精度或复杂调度的场景。对于更复杂的用例可能需要使用专门的定时器库或考虑使用操作系统提供的定时器服务。 另外这个实现中使用了 std::thread::detach 来分离线程。这意味着一旦线程完成执行它会自动释放所有资源。然而在某些情况下使用 detach 可能会导致问题因为它不允许检查线程是否已安全完成执行。在更复杂的应用程序中使用 std::future 和 std::async 可能是更好的选择因为它们提供了更好的异常处理和线程同步机制。 4 多线程搜索算法 在 C 中可以使用多线程来加速搜索算法特别是当处理大量数据或可以并行处理多个搜索任务时。以下是一个简单的例子展示了如何使用 C 的多线程功能来加速一个简单的线性搜索算法。 假设有一个很大的整数数组并且想要找到某个特定的值。可以将数组分成多个部分并为每个部分分配一个线程来执行搜索。这样搜索任务就可以并行执行从而加速搜索过程。 如下为样例代码 #include iostream #include vector #include thread #include atomic // 搜索函数用于单个线程 bool searchInRange(const std::vectorint data, size_t start, size_t end, int target, std::atomicbool found) {for (size_t i start; i end; i){if (data[i] target){found true;return true;}}return false; }// 多线程搜索函数 bool parallelSearch(const std::vectorint data, int target, size_t threadCount) {std::atomicbool found(false);const size_t rangeSize data.size() / threadCount;std::vectorstd::thread threads;// 为每个线程分配一个搜索范围 for (size_t i 0; i threadCount; i){size_t start i * rangeSize;size_t end (i threadCount - 1) ? data.size() : start rangeSize;threads.emplace_back(searchInRange, std::ref(data), start, end, target, std::ref(found));}// 等待所有线程完成 for (auto thread : threads){thread.join();}// 检查是否找到了目标 return found; }int main() {// 示例数据 std::vectorint data { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };int target 6;// 使用多线程搜索 const size_t threadCount std::thread::hardware_concurrency(); // 获取可用的CPU核心数 if (parallelSearch(data, target, threadCount)) {printf(found target %d in parallel search\n, target);}else {printf(target %d not found in parallel search\n, target);}return 0; }上面代码的输出为 found target 6 in parallel search在上面代码中 parallelSearch 函数负责创建多个线程并将搜索任务分配给它们。每个线程都会调用 searchInRange 函数该函数负责在分配给它的数组范围内搜索目标值。 std::atomic 类型的 found 变量用于跨线程同步搜索结果。 注意这个简单的例子并没有考虑数据划分和线程同步的复杂性。在实际应用中可能需要更复杂的策略来确保数据被均匀划分并避免线程间的数据竞争。此外对于某些类型的数据和搜索算法多线程搜索可能并不会带来性能提升甚至可能导致性能下降因为线程创建和管理本身也需要资源。因此在决定使用多线程之前最好先分析数据和算法看看它们是否适合并行处理。
文章转载自:
http://www.morning.dnls.cn.gov.cn.dnls.cn
http://www.morning.nqnqz.cn.gov.cn.nqnqz.cn
http://www.morning.rrwgh.cn.gov.cn.rrwgh.cn
http://www.morning.qdcpn.cn.gov.cn.qdcpn.cn
http://www.morning.rtsdz.cn.gov.cn.rtsdz.cn
http://www.morning.gcxfh.cn.gov.cn.gcxfh.cn
http://www.morning.cpqwb.cn.gov.cn.cpqwb.cn
http://www.morning.fnczn.cn.gov.cn.fnczn.cn
http://www.morning.mjytr.cn.gov.cn.mjytr.cn
http://www.morning.gynlc.cn.gov.cn.gynlc.cn
http://www.morning.rqnhf.cn.gov.cn.rqnhf.cn
http://www.morning.dpqqg.cn.gov.cn.dpqqg.cn
http://www.morning.kyfnh.cn.gov.cn.kyfnh.cn
http://www.morning.zpkfb.cn.gov.cn.zpkfb.cn
http://www.morning.jkrrg.cn.gov.cn.jkrrg.cn
http://www.morning.hlshn.cn.gov.cn.hlshn.cn
http://www.morning.kmlmf.cn.gov.cn.kmlmf.cn
http://www.morning.27asw.cn.gov.cn.27asw.cn
http://www.morning.qkskm.cn.gov.cn.qkskm.cn
http://www.morning.rpljf.cn.gov.cn.rpljf.cn
http://www.morning.mlpmf.cn.gov.cn.mlpmf.cn
http://www.morning.zpyxl.cn.gov.cn.zpyxl.cn
http://www.morning.yrrnx.cn.gov.cn.yrrnx.cn
http://www.morning.ntdzjx.com.gov.cn.ntdzjx.com
http://www.morning.fktlg.cn.gov.cn.fktlg.cn
http://www.morning.bnwlh.cn.gov.cn.bnwlh.cn
http://www.morning.bnrnb.cn.gov.cn.bnrnb.cn
http://www.morning.kwyq.cn.gov.cn.kwyq.cn
http://www.morning.btcgq.cn.gov.cn.btcgq.cn
http://www.morning.mkyxp.cn.gov.cn.mkyxp.cn
http://www.morning.rlqqy.cn.gov.cn.rlqqy.cn
http://www.morning.wmgjq.cn.gov.cn.wmgjq.cn
http://www.morning.ypqwm.cn.gov.cn.ypqwm.cn
http://www.morning.bwjws.cn.gov.cn.bwjws.cn
http://www.morning.fqqcn.cn.gov.cn.fqqcn.cn
http://www.morning.nhzps.cn.gov.cn.nhzps.cn
http://www.morning.qgjgsds.com.cn.gov.cn.qgjgsds.com.cn
http://www.morning.hmktd.cn.gov.cn.hmktd.cn
http://www.morning.jqhrk.cn.gov.cn.jqhrk.cn
http://www.morning.tgtrk.cn.gov.cn.tgtrk.cn
http://www.morning.jrdbq.cn.gov.cn.jrdbq.cn
http://www.morning.snygg.cn.gov.cn.snygg.cn
http://www.morning.snbry.cn.gov.cn.snbry.cn
http://www.morning.smdkk.cn.gov.cn.smdkk.cn
http://www.morning.rfyff.cn.gov.cn.rfyff.cn
http://www.morning.pxbky.cn.gov.cn.pxbky.cn
http://www.morning.zlrrj.cn.gov.cn.zlrrj.cn
http://www.morning.fkmqg.cn.gov.cn.fkmqg.cn
http://www.morning.ybnzn.cn.gov.cn.ybnzn.cn
http://www.morning.kabaifu.com.gov.cn.kabaifu.com
http://www.morning.zrbpx.cn.gov.cn.zrbpx.cn
http://www.morning.jkzq.cn.gov.cn.jkzq.cn
http://www.morning.psxfg.cn.gov.cn.psxfg.cn
http://www.morning.tqsnd.cn.gov.cn.tqsnd.cn
http://www.morning.blqsr.cn.gov.cn.blqsr.cn
http://www.morning.nrwr.cn.gov.cn.nrwr.cn
http://www.morning.gzxnj.cn.gov.cn.gzxnj.cn
http://www.morning.rchsr.cn.gov.cn.rchsr.cn
http://www.morning.lrybz.cn.gov.cn.lrybz.cn
http://www.morning.ggnjq.cn.gov.cn.ggnjq.cn
http://www.morning.bctr.cn.gov.cn.bctr.cn
http://www.morning.snmsq.cn.gov.cn.snmsq.cn
http://www.morning.hmqmm.cn.gov.cn.hmqmm.cn
http://www.morning.dysgr.cn.gov.cn.dysgr.cn
http://www.morning.dkcpt.cn.gov.cn.dkcpt.cn
http://www.morning.jntcr.cn.gov.cn.jntcr.cn
http://www.morning.wkhfg.cn.gov.cn.wkhfg.cn
http://www.morning.nqnqz.cn.gov.cn.nqnqz.cn
http://www.morning.nzkkh.cn.gov.cn.nzkkh.cn
http://www.morning.ghkgl.cn.gov.cn.ghkgl.cn
http://www.morning.lylkh.cn.gov.cn.lylkh.cn
http://www.morning.aswev.com.gov.cn.aswev.com
http://www.morning.lprfk.cn.gov.cn.lprfk.cn
http://www.morning.fbhmn.cn.gov.cn.fbhmn.cn
http://www.morning.mdwtm.cn.gov.cn.mdwtm.cn
http://www.morning.fglxh.cn.gov.cn.fglxh.cn
http://www.morning.khtyz.cn.gov.cn.khtyz.cn
http://www.morning.qpnmd.cn.gov.cn.qpnmd.cn
http://www.morning.scjtr.cn.gov.cn.scjtr.cn
http://www.morning.bpmtx.cn.gov.cn.bpmtx.cn
http://www.tj-hxxt.cn/news/257817.html

相关文章:

  • 网站制作商城onethink 网站
  • 设计师门户网站程序wordpress 主题插件
  • 汕头建网站贵安新区建设管理信息网站
  • 广州招聘网站制作手机版网站开发用什么语言
  • 网络平台建站软文代发代理
  • 昆明展示型网站开发网页设计作业 定做
  • 化妆品网站开发可行性成都市那里有网站建设制作公司
  • 乐清建设网站园林景观设计公司年度运营方案
  • 常用的网站开发电商网站推广
  • asp.net 窗体网站wordpress编辑器代码
  • wordpress和tiis 网站 优化
  • 免费建设互动的网站网站运行环境配置
  • 寻找手机网站建设北京网站怎么建设
  • 做产品设计之前怎么查资料国外网站网站建设经营范围怎么写
  • 生态文明建设网站专题培训上海高端定制网站公司
  • 建网站需要了解哪些网站建设知识收录网站源码
  • 织梦建公司网站软件开发的五个基本步骤
  • 做素食香料哪个网站买国际网站设计
  • 做网站找公司怎么找dw如何导出成为一个网页
  • 关于茶文化网站建设的背景提高销售的10种方法
  • 中国建设银行注册网站怎么建立一个群
  • 网站建设及推广优化网站问题图片
  • 产品网站免费模板设计制作小车的基本步骤
  • 上海黄浦区网站建设专门做眼镜的网站
  • 银川做网站的 公司有哪些搜索更多网页内容
  • 网站建设网站制作公司哪家好设计图案大全
  • 网站网站建设方案书怎么写页面设计收获心得
  • 苏州网站怎么做怎样做网站域名注册
  • 网站建设需要费用wordpress olve
  • 外贸网站源码多语言济南企业如何建网站