C++11 14 17线程

线程类封装

#include<thread>
#include<iostream>
#include<string>using namespace std::chrono_literals;
class MyThread {
public:void Main() {std::cout << "MyThread Main" << name << ":" << age;}
private:std::string name;int age = 100;
};class XThread {
public:virtual void Start() {_is_exit = false;_th = std::thread(&XThread::Main, this);}virtual void Stop() {_is_exit = true;Wait();}virtual void Wait() {if (_th.joinable())_th.join();}bool is_exit() { return _is_exit; }
private:virtual void Main() = 0;std::thread _th;bool _is_exit = false;
};class TestXThread:public XThread {
public:void Main() override {while (!is_exit()) {std::this_thread::sleep_for(100ms);std::cout << "." << std::flush;}}std::string name;
};

超时锁

超时锁是一种同步机制,用于在尝试获取锁时设置一个超时时间。如果线程在指定的时间内无法获取锁,它将放弃,而不是无限期地等待。这种机制对于避免死锁和提高系统的响应性非常有用

try_lock_for(duration): 这个方法允许线程尝试在指定的时间段内获取锁。如果在这段时间内锁未被获取,则返回 false。这里的 duration 是一个表示时间长度的对象,比如可以使用 std::chrono 库来指定

try_lock_for std::timed_mutex 或类似互斥体(如 std::recursive_timed_mutex)的一个成员函数,它尝试在指定时间段内获取锁。如果在这个时间段内成功获得锁,它会返回 true;如果时间段结束时仍未获得锁,它会返回 false。这种机制允许线程不会无限期地等待锁的释放,提高了程序的响应性和灵活性。

递归锁

共享锁

共享锁(Shared Lock),在多线程编程和数据库管理系统中,是一种用于控制对共享资源的并发访问的同步机制。与互斥锁(独占锁)不同,共享锁允许多个线程或进程同时读取同一资源,但在写入时仍然需要独占访问权限。

lock_shared()函数用于获取共享锁,也称为读锁。当你希望多个线程能够同时读取某个共享数据时使用。在任何时刻,可以有多个线程持有共享锁,只要没有线程持有独占锁。这允许多个读操作并行执行,而不会互相冲突,因为读操作通常不会改变数据状态。

lock()函数用于获取独占锁,也称为写锁。当你希望确保只有一个线程能够写入或修改共享数据时使用。独占锁保证了没有其他线程可以同时读取或写入共享资源,确保了对共享资源的独占访问权。

利用RAII

#include <thread>
#include <iostream>
#include <string>
#include <mutex>
#include <shared_mutex>
//Linux -lpthread
using namespace std;
// RAII
class XMutex
{
public:XMutex(mutex& mux):mux_(mux){cout << "Lock" << endl;mux.lock();}~XMutex(){cout << "Unlock" << endl;mux_.unlock();}
private:mutex& mux_;
};
static mutex mux;
void TestMutex(int status)
{XMutex lock(mux);if (status == 1){cout << "=1" << endl;return;}else{cout << "!=1" << endl;return;}
}
int main(int argc, char* argv[])
{TestMutex(1);TestMutex(2);getchar();return 0;
}

lock_guard

std::lock_guard 是 C++ 标准库中的一个模板类,用于简化互斥锁(如 std::mutex)的管理。它实现了一种被称为“范围锁定”(RAII, Resource Acquisition Is Initialization)的模式,确保在持有锁的线程的执行范围内,锁一定会被持有,并在范围结束时自动释放。

#include <thread>
#include <iostream>
#include <string>
#include <mutex>
#include <shared_mutex>
//Linux -lpthread
using namespace std;
// RAII
class XMutex
{
public:XMutex(mutex& mux):mux_(mux){cout << "Lock" << endl;mux.lock();}~XMutex(){cout << "Unlock" << endl;mux_.unlock();}
private:mutex& mux_;
};
static mutex mux;
void TestMutex(int status)
{XMutex lock(mux);if (status == 1){cout << "=1" << endl;return;}else{cout << "!=1" << endl;return;}
}static mutex gmutex;
void TestLockGuard(int i)
{gmutex.lock();{//�Ѿ�ӵ��������locklock_guard<mutex> lock(gmutex,adopt_lock);//�����ͷ���}{lock_guard<mutex> lock(gmutex);cout << "begin thread " << i << endl;}for (;;){{lock_guard<mutex> lock(gmutex);cout << "In " << i << endl;}this_thread::sleep_for(500ms);}
}
int main(int argc, char* argv[])
{for (int i = 0; i < 3; i++){thread th(TestLockGuard, i + 1);th.detach();}TestMutex(1);TestMutex(2);getchar();return 0;
}

unique_lock

在 C++ 中的多线程编程里,锁的标签(或锁策略标签)是一些用于指定锁的行为的标记。这些标签通常与锁管理器(如 std::unique_lockstd::lock_guard)一起使用,来控制互斥量的锁定和解锁行为。以下是一些常见的锁的标签:

  1. std::adopt_lock 这个标签用于指示锁管理器对象,互斥量在传递给锁管理器之前已经被当前线程锁定。锁管理器将“采用”这个已经存在的锁,并在其析构时释放它。使用 std::adopt_lock 需要确保互斥量在传递之前已经被锁定。

  2. std::defer_lock 使用这个标签创建的锁管理器对象不会立即锁定互斥量。这允许延迟锁定操作,直到显式调用锁定方法。这提供了更多的控制,允许在需要时进行锁定。

  3. std::try_to_lock 用这个标签构造的锁管理器会尝试锁定互斥量,但不会阻塞等待。如果互斥量当前不可用(已被其他线程锁定),锁管理器不会持有锁。

shared_lock

scope_lock

std::scoped_lock 是 C++17 标准引入的一个锁管理器,用于简化多个互斥锁的获取和释放,从而帮助避免死锁。它是一种作用域锁(scope-based locking),能够在构造时自动获取一个或多个互斥锁,并在离开作用域(即对象被销毁)时自动释放这些锁。

互斥锁+list模拟线程通信

条件变量

生产者消费者模型

#include <thread>
#include <iostream>
#include <mutex>
#include <list>
#include <string>
#include <sstream>
using namespace std;list<string> msgs_;
mutex mux;
condition_variable cv;void ThreadWrite() {for (int i = 0;; i++) {stringstream ss;ss << "Write msg" << i;unique_lock<mutex>lock(mux);msgs_.push_back(ss.str());cv.notify_one();this_thread::sleep_for(3s);}
}void ThreadRead(int i) {while (true) {unique_lock<mutex>lock(mux);cout << "read msg" << endl;cv.wait(lock, [i] {cout << i << "wait" << endl;return !msgs_.empty();});}while (!msgs_.empty()) {cout << i << "read" << msgs_.front() << endl;msgs_.pop_front();}
}int main() {}

线程的异步和通信

线程池

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/326081.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

数据结构 模拟实现LinkedList双向不循环链表

目录 一、双向不循环链表的概念 二、链表的接口 三、链表的方法实现 &#xff08;1&#xff09;display方法 &#xff08;2&#xff09;size方法 &#xff08;3&#xff09;contains方法 &#xff08;4&#xff09;addFirst方法 &#xff08;5&#xff09;addLast方法 …

【HBase】——优化

1 RowKey设计 重要&#xff1a;一条数据的唯一标识就是 rowkey&#xff0c;那么这条数据存储于哪个分区&#xff0c;取决于 rowkey 处于 哪个一个预分区的区间内&#xff0c;设计 rowkey的主要目的 &#xff0c;就是让数据均匀的分布于所有的 region 中&#xff0c;在一定程度…

西电期末1025.平滑滤波

一.题目 二.分析与思路 别光看公式&#xff0c;读题干&#xff1a;“位置i的输出为距离i最近的三个输入的平均值”&#xff0c;再看示例&#xff0c;输入几个&#xff0c;输出几个&#xff0c;所以就是输出每个位置距离最近的三个输入的平均值&#xff0c;中间没什么问题&…

Service Weaver:Google开源基于分布式应用程序开发的框架,重新定义微服务边界

大家好&#xff0c;我是萧楚河&#xff0c;公众号&#xff1a;golang面试经典讲解&#xff0c;感谢关注&#xff0c;一起学习一起成长。一、前言 今年6月&#xff0c;一群谷歌员工&#xff08;由谷歌软件工程师Michael Whittaker领导&#xff09;发表了一篇名为“Towards Mode…

PyTorch基础操作

一、Tensor 在 PyTorch 中&#xff0c;张量&#xff08;Tensor&#xff09;是一个核心概念&#xff0c;它是一个用于存储和操作数据的多维数组&#xff0c;类似于 NumPy 的 ndarray&#xff0c;但与此同时&#xff0c;它也支持 GPU 加速&#xff0c;这使得在大规模数据上进行科…

vue简单实现滚动条

背景&#xff1a;产品提了一个需求在一个详情页&#xff0c;一个form表单元素太多了&#xff0c;需要滚动到最下面才能点击提交按钮&#xff0c;很不方便。他的方案是&#xff0c;加一个滚动条&#xff0c;这样可以直接拉到最下面。 优化&#xff1a;1、支持滚动条&#xff0c;…

吉林大学19、21级计算机学院《计算机网络》期末真题试题

一、21级&#xff08;考后回忆&#xff09; 一、不定项选择&#xff08;一共10个选择题&#xff0c;一个两分&#xff0c;选全得满分&#xff09; 不定项&#xff1a;可以选择1~4个 考点有&#xff1a; ①协议、服务 ②码分多路复用通过接受码片序列&#xff0c;求哪个站点发送…

Java反射篇----第三篇

系列文章目录 文章目录 系列文章目录前言一、反射使用步骤(获取 Class 对象、调用对象方法)二、获取 Class 对象有几种方法三、利用反射动态创建对象实例前言 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站,这篇文章…

分布式协调系统

分布式协调系统 分布式协调系统解决的进程间的通信和协作&#xff0c;根据是否在同一时间和是否相互引用分为四个模型。 示例系统Chubby 主功能&#xff1a;让客户端实现同步&#xff0c;方法是加锁服务 介绍一下系统&#xff1a; 系统由五台服务器构成&#xff0c;通过pax…

STM32通用定时器-输入捕获-脉冲计数

一、知识点 编码器   两相编码器&#xff08;正交编码器&#xff09;&#xff1a;两相编码器由 A 相和 B 相组成&#xff0c;相位差为 90 度。当旋转方向为顺时针时&#xff0c;A 相先变化&#xff0c;然后 B 相变化&#xff1b;当旋转方向为逆时针时&#xff0c;B 相先变化…

【leetcode】字符串中的第一个唯一字符

题目描述 给定一个字符串 s &#xff0c;找到 它的第一个不重复的字符&#xff0c;并返回它的索引 。如果不存在&#xff0c;则返回 -1 。 用例 示例 1&#xff1a; 输入: s “leetcode” 输出: 0 示例 2: 输入: s “loveleetcode” 输出: 2 示例 3: 输入: s “aabb”…

扩展 apiserver 连接认证 ip, apiserver证书更新

本文来自我的博客地址 文章目录 问题场景:问题分析:问题解决:查看 apiserver 证书支持的 ip 或 host使用 openssl 生成证书:再次查看 apiserver 证书支持的 ip 或 host 再次尝试将 master 加点加入参考 问题场景: k8s 1.28.1 集群后期新增 vip apiserver 证书不支持 vip 引入…