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

奇月网络官方网站团购网站模板下载

奇月网络官方网站,团购网站模板下载,电子商务网站建设基础,自己动手做衣服的网站C并发编程:构建线程安全队列(第一部分:粗粒度锁) 引言 在多线程编程中,线程之间的数据共享和通信是一个非常重要的问题。在这篇博客中,我们将讨论如何用C实现一个基础但非常实用的线程安全队列。这个队列…

C++并发编程:构建线程安全队列(第一部分:粗粒度锁)

引言

在多线程编程中,线程之间的数据共享和通信是一个非常重要的问题。在这篇博客中,我们将讨论如何用C++实现一个基础但非常实用的线程安全队列。这个队列使用粗粒度的互斥锁和条件变量来实现。

线程安全队列的基础实现

下面是基础代码结构:

template <typename T>
class threadsafe_queue
{
private:mutable std::mutex mut;std::queue<std::shared_ptr<T>> data_queue;std::condition_variable data_cond;// ...(省略其余代码)
};

互斥锁和条件变量

  • std::mutex mut: 用于确保队列操作的线程安全。
  • std::condition_variable data_cond: 用于阻塞和唤醒等待队列操作的线程。

push方法

void push(T new_value)
{std::shared_ptr<T> data(std::make_shared<T>(std::move(new_value)));std::unique_lock lk(mut);data_queue.push(data);data_cond.notify_one();
}

这里使用 std::unique_lock 来获取互斥锁,确保数据的线程安全。然后使用 data_cond.notify_one() 来唤醒可能正在等待队列变为非空的线程。

pop方法

对于 pop,我们有两个版本:

  1. wait_and_pop:等待直到队列非空。
  2. try_pop:尝试弹出,如果队列为空则立即返回。
void wait_and_pop(T& value)
{std::unique_lock lk(mut);data_cond.wait(lk, [this] { return !data_queue.empty(); });value = std::move(*data_queue.front());data_queue.pop();
}bool try_pop(T& value)
{std::unique_lock lk(mut);if (data_queue.empty()) return false;value = std::move(*data_queue.front());data_queue.pop();return true;
}

wait_and_pop 中,我们使用 data_cond.wait() 来阻塞当前线程,直到队列变为非空。

测试

我们使用了一个生产者线程和两个消费者线程进行测试。

// 测试函数
void test_threadsafe_queue()
{threadsafe_queue<int> tsq;// 创建一个生产者线程std::thread producer([&](){for (int i = 0; i < 10; ++i){std::cout << "Pushing " << i << std::endl;tsq.push(i);}});// 创建两个消费者线程std::thread consumer1([&](){for (int i = 0; i < 5; ++i){int value;tsq.wait_and_pop(value);std::cout << "Consumer 1 popped " << value << std::endl;}});std::thread consumer2([&](){for (int i = 0; i < 5; ++i){int value;tsq.wait_and_pop(value);std::cout << "Consumer 2 popped " << value << std::endl;}});// 等待所有线程完成producer.join();consumer1.join();consumer2.join();
}

完整代码

template <typename T>
class threadsafe_queue
{
private:mutable std::mutex mut;std::queue<std::shared_ptr<T>> data_queue;std::condition_variable data_cond;public:threadsafe_queue() = default;void wait_and_pop(T& value){std::unique_lock lk(mut);data_cond.wait(lk, [this] { return !data_queue.empty(); });value = std::move(*data_queue.front());data_queue.pop();}bool try_pop(T& value){std::unique_lock lk(mut);if (data_queue.empty()) return false;value = std::move(*data_queue.front());data_queue.pop();return true;}std::shared_ptr<T> wait_and_pop(){std::unique_lock lk(mut);data_cond.wait(lk, [this] { return !data_queue.empty(); });std::shared_ptr<T> res = data_queue.front();data_queue.pop();return res;}std::shared_ptr<T> try_pop(){std::unique_lock lk(mut);if (data_queue.empty()) return std::make_shared<T>();std::shared_ptr<T> res = data_queue.front();data_queue.pop();return res;}void push(T new_value){std::shared_ptr<T> data(std::make_shared<T>(std::move(new_value)));std::unique_lock lk(mut);data_queue.push(data);data_cond.notify_one();}bool empty(){std::unique_lock lk(mut);return data_queue.empty();}
};// 测试函数
void test_threadsafe_queue()
{threadsafe_queue<int> tsq;// 创建一个生产者线程std::thread producer([&](){for (int i = 0; i < 10; ++i){std::cout << "Pushing " << i << std::endl;tsq.push(i);}});// 创建两个消费者线程std::thread consumer1([&](){for (int i = 0; i < 5; ++i){int value;tsq.wait_and_pop(value);std::cout << "Consumer 1 popped " << value << std::endl;}});std::thread consumer2([&](){for (int i = 0; i < 5; ++i){int value;tsq.wait_and_pop(value);std::cout << "Consumer 2 popped " << value << std::endl;}});// 等待所有线程完成producer.join();consumer1.join();consumer2.join();
}int main()
{test_threadsafe_queue();return 0;
}

总结

这篇博客中,我们简要介绍了如何使用C++的标准库来实现一个基础的线程安全队列。虽然我们使用了粗粒度的互斥锁,但这个实现是非常实用和直观的。在下一篇博客中,我们将讨论如何进行优化,以提高性能和效率。

http://www.yayakq.cn/news/896318/

相关文章:

  • 神兵网站建设火车票网站建设多少
  • 电子商务网站规划书提高怎样做网站的外链
  • 软件公司做网站国外域名注册服务商
  • 做我女朋友网站p0rn视频营销型网站建设总结
  • 网站没备案怎么做淘宝客在线设计响应式网站
  • 上海企业网站制作电话横沥镇网站仿做
  • 网站建设包含的内容wordpress 开启链接
  • 自己建网站买玩具网店托管代运营公司
  • 国外优秀网站建设公司简单页面设计
  • 网站设计制作程序网站怎么做白色字
  • 蛋糕网站网页设计织梦分类信息做的网站
  • 企业组织网站建设方案做那种事情的网站
  • 中国建设银行网站首页u盾登入如何去掉 wordpress
  • 免费网站空间重庆南岸营销型网站建设公司哪家好
  • 哪里建设网站最好建设银行网站诚聘英才
  • 挂机宝可以做网站吗英语网站 php源码
  • 自建站系统广西营销型网站公司
  • wordpress 插件交互团购网站seo
  • 通过主机名访问网站网络营销运营策划
  • 门户网站开发过程视频有限责任公司的优缺点
  • 网站开发需要学php吗安卓是哪里开发的
  • 珠宝首饰网站模板做好的网站怎么优化
  • 云电子网站开发免费的代码分享网站
  • 电商网站建设策划书最新热点新闻事件
  • 精品课程网站建设建议wordpress 相关推荐
  • 普洱专业企业网站建设个人帮忙做网站吗
  • 可以做外贸的网站有哪些页面访问紧急升级中通知怎么关闭
  • 黑龙江省建设厅的网站首页在线代理app
  • 门户网站区别外贸怎么做网站
  • cms 美容网站 模版做盗链电影网站怎么样