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

徐汇品牌网站建设wordpress首页调用所有分类

徐汇品牌网站建设,wordpress首页调用所有分类,视频号认证需要多少钱,关于进一步优化 广州介绍 在多线程编程的世界里,协调不同线程之间的工作是一项极具挑战性的任务。线程可能需要等待特定条件的满足,或者对共享资源的访问进行限制。C 标准库为我们提供了强大的工具,如 std::thread 用于创建和管理线程,条件变量用于线…

介绍

在多线程编程的世界里,协调不同线程之间的工作是一项极具挑战性的任务。线程可能需要等待特定条件的满足,或者对共享资源的访问进行限制。C++ 标准库为我们提供了强大的工具,如 std::thread 用于创建和管理线程,条件变量用于线程间的同步,信号量则用于控制对资源的访问。本文将通过具体的 C++ 代码示例,详细介绍如何使用这些工具。

std::thread 基础

std::thread 是 C++11 引入的用于创建和管理线程的类。它允许我们轻松地在程序中创建新的执行线程。下面是一个简单的 std::thread

#include <iostream>
#include <thread>void printMessage(const std::string& message) {std::cout << "Thread says: " << message << std::endl;
}int main() {std::thread t(printMessage, "Hello, World!");t.join();return 0;
}

定义了一个函数 printMessage,然后使用 std::thread 创建了一个新线程,并将 printMessage 函数作为线程的入口点,同时传递了一个字符串参数。join() 方法用于等待线程执行完毕。

条件变量

条件变量是一种同步原语,用于线程之间的通信和协调。它允许一个线程等待某个条件的满足,而另一个线程可以在条件满足时通知等待的线程。
生产者 - 消费者模型示例
生产者 - 消费者模型是多线程编程中常见的模式,生产者线程负责生产数据,消费者线程负责消费数据。我们可以使用条件变量来实现线程间的同步。

#include <iostream>
#include <queue>
#include <thread>
#include <mutex>
#include <condition_variable>std::queue<int> dataQueue;
std::mutex mtx;
std::condition_variable cv;
bool isProducing = true;// 生产者线程函数
void producer() {for (int i = 0; i < 5; ++i) {std::this_thread::sleep_for(std::chrono::seconds(1));{std::unique_lock<std::mutex> lock(mtx);dataQueue.push(i);std::cout << "Produced: " << i << std::endl;}cv.notify_one();}{std::unique_lock<std::mutex> lock(mtx);isProducing = false;}cv.notify_one();
}//消费者线程函数
void consumer() {while (true) {std::unique_lock<std::mutex> lock(mtx);cv.wait(lock, [] { return!dataQueue.empty() ||!isProducing; });if (!dataQueue.empty()) {int value = dataQueue.front();dataQueue.pop();std::cout << "Consumed: " << value << std::endl;} else if (!isProducing) {break;}}
}int main() {std::thread producerThread(producer);std::thread consumerThread(consumer);producerThread.join();consumerThread.join();return 0;
}

std::queue dataQueue:用于存储生产者生产的数据。
std::mutex mtx:用于保护对 dataQueue 的访问,确保线程安全。
std::condition_variable cv:用于线程间的同步。
producer() 函数:生产者线程每隔 1 秒生产一个数据,并将其加入队列。生产完成后,通知消费者线程。
consumer() 函数:消费者线程等待条件变量的通知,当队列中有数据时,从队列中取出数据进行消费。
cv.wait(lock, [] { return!dataQueue.empty() ||!isProducing; }):消费者线程等待,直到队列非空或者生产结束。

信号量

信号量是一种用于控制对资源访问的同步原语。在 C++ 标准库中,并没有直接提供信号量的实现,可以使用 std::mutex 和 std::condition_variable 来模拟信号量。
信号量的实现

#include <mutex>
#include <condition_variable>class Semaphore {
public:Semaphore(int count = 0) : count_(count) {}void notify() {std::unique_lock<std::mutex> lock(mtx_);++count_;cv_.notify_one();}void wait() {std::unique_lock<std::mutex> lock(mtx_);cv_.wait(lock, [this] { return count_ > 0; });--count_;}private:int count_;std::mutex mtx_;std::condition_variable cv_;
};
#include <iostream>
#include <thread>
#include <vector>Semaphore sem(2); // 允许最多 2 个线程同时访问资源void accessResource(int id) {sem.wait();std::cout << "Thread " << id << " is accessing the resource." << std::endl;std::this_thread::sleep_for(std::chrono::seconds(2));std::cout << "Thread " << id << " has finished accessing the resource." << std::endl;sem.notify();
}int main() {std::vector<std::thread> threads;for (int i = 0; i < 5; ++i) {threads.emplace_back(accessResource, i);}for (auto& t : threads) {t.join();}return 0;
}

Semaphore 类:实现了一个简单的信号量。notify() 方法用于增加信号量的值并通知等待的线程,wait() 方法用于等待信号量的值大于 0 并减少信号量的值。
accessResource() 函数:线程在访问资源前调用 sem.wait() 等待信号量,访问完成后调用 sem.notify() 释放信号量。
emplace_back 是 C++ 标准库容器(如 std::vector、std::deque 等)提供的一个成员函数,它主要用于在容器的尾部直接构造一个新元素。

结论

通过 std::thread、条件变量和信号量,可以在 C++ 中实现复杂的多线程程序。条件变量用于线程间的同步,确保线程在特定条件满足时才继续执行;信号量用于控制对资源的访问,避免资源竞争。合理使用这些工具可以提高程序的性能和稳定性。希望本文能帮助你更好地理解和应用这些多线程编程的重要概念。


文章转载自:

http://ViHGhMZx.gxhqt.cn
http://Xv62v8wG.gxhqt.cn
http://BR9HMth6.gxhqt.cn
http://BfLGD7QW.gxhqt.cn
http://FgjP2zFo.gxhqt.cn
http://yOzNR0sD.gxhqt.cn
http://pTZcosEM.gxhqt.cn
http://1D5xs09P.gxhqt.cn
http://EFVE2pQF.gxhqt.cn
http://o1Us1G4z.gxhqt.cn
http://ob8K23lL.gxhqt.cn
http://sclniKj7.gxhqt.cn
http://5QGhqm3u.gxhqt.cn
http://3gaBNE8e.gxhqt.cn
http://OSJvItbF.gxhqt.cn
http://uqyerjI1.gxhqt.cn
http://8PwLqA5K.gxhqt.cn
http://gplcFq8p.gxhqt.cn
http://PDb8wTot.gxhqt.cn
http://WWJ75JPR.gxhqt.cn
http://1bHmHQgN.gxhqt.cn
http://FuJrmfFF.gxhqt.cn
http://gGepojkG.gxhqt.cn
http://jnTwPZqW.gxhqt.cn
http://qW5JH2uf.gxhqt.cn
http://IBGo5ZFG.gxhqt.cn
http://BLWF11hq.gxhqt.cn
http://Xy0hvRzR.gxhqt.cn
http://f4nXpiJQ.gxhqt.cn
http://V7O7w9Mu.gxhqt.cn
http://www.dtcms.com/wzjs/762415.html

相关文章:

  • 成都兴光华城市建设公司网站校园文化建设图片网站
  • 济宁计算机网站建设培训班坪山模板网站建设公司
  • 营销crm系统网站设计南京做网站建设的公司哪家好
  • 点击即玩的小游戏网站网站与网站自动跳转代码
  • 泛华建设集团网站用dw做网站用div布局
  • 公司网站如何做优化用记事本做电影介绍的网站
  • 自建网站的优缺点保洁公司哪家好
  • 网站建设公司市场开发方案济宁市做网站的公司
  • 免费店铺logo设计seo常用方法
  • 镇江市精神文明建设网站蒙古文网站建设工作情况汇报
  • 建设厅网站预算员报名时间怎么制作视频网站
  • 太仓市住房和城乡建设局规网站青州网站搭建
  • 中企动力制作的网站后台seo优化排名技术百度教程
  • 大连手机自适应网站建设报价律所网站建设方案书怎么写
  • 彩票网站开发合法吗wordpress制作网页
  • 网站域名更改应用中心下载
  • 巩义网站建设wordpress mysql5.5
  • 网站制作方案怎么写建筑公司企业愿景文案平台
  • 手机如何访问电脑做的asp网站军事新闻
  • 家里面的服务器可以做网站吗烟台做网站哪家做的好
  • 1688货源网官方网站网页设计尺寸竖版
  • 电话网站源码网站建设学的是什么知识
  • 北京朝林建设集团网站织梦门户网站源码下载
  • vs网站开发建表怎么肩啊友情链接的网站有哪些
  • 东莞优速网站建设推广罗裕立创电子元器件商城官网
  • 要想用谷歌访问外国网站怎么做珠海商城网站
  • 手机响应式网站怎么做wordpress 最大上传文件大小 8m
  • 怎么做一个简单的网站软件开发文档编写
  • 东莞做网站-南城信科网页设计步骤模板素材
  • 网站自助搭建平台红色礼品网站模板