- 博客(16)
- 资源 (2)
- 问答 (2)
- 收藏
- 关注
原创 12 —— 虚假唤醒、线程数量谈、线程池浅谈
一 虚假唤醒 什么是虚假唤醒?我们先看以前关于condition_variable的例子 class A { public: // 把收到的消息传入队列 void inMsgRecvQueue() { for (size_t i = 0; i < 1000; ++i) { cout << "收到消息,并放入队列 " << i << ...
2019-06-30 21:36:52 256
原创 11 —— windows临界区、其它mutex互斥量
一 windows临界区 #include <iostream> #include <thread> #include <list> #include <mutex> #include <Windows.h> #define __WINDOWSJQ_ using namespace std; class A { public: ...
2019-06-29 17:42:31 160
原创 包含min函数的栈 ----《剑指offer》面试题21
题目 定义栈的数据结构,请在该类型中实现一个能够得到栈的最小元素的min函数。在该栈中,调用min、push及pop的时间复杂度都是O(1) 思路 用一个std::stack<std::pair<int,int>>表示这个栈, pair<int,int>中 first表示要插入的值,second表示当前栈中最小的元素。 这样每次栈顶元素的second的值...
2019-06-28 18:04:04 113
原创 10 —— std::async()深入谈
一 std::async()的四种参数使用情况 A std::launch::deferred 延迟异步任务调用,并不创建新线程。等future对象调用get()或者wait()时才去执行线程入口函数,如果没调用,则不执行。 B std::launch::async 强制这个异步任务在新线程上执行。这意味着系统必须创建出新线程来执行线程入口函数。 C std::launch::deferred...
2019-06-28 00:34:41 623
原创 9 —— 原子操作std::atomic
一 原子操作概念引出范例 #include <iostream> #include <thread> using namespace std; int g_count = 0; // 定义一个全局量,供两个线程同时访问 void mythread() // 线程入口函数 { for (int i = 0; i < 10000000; i++) { g_c...
2019-06-27 23:44:10 777
原创 8 —— future其它成员函数、shared_future
一 future其它成员函数 wait_for() 卡住当前流程,等待std::async()的异步任务运行一段时间,然后返回其状态std::future_status。如果std::async()的参数是std::launch::deferred(延迟执行),则不会卡住主流程。 std::future_status 枚举类型,表示异步任务的执行状态。 std::future_sta...
2019-06-27 22:49:08 430
原创 C++17 filesystem使用
问题 a目录下有多个话单文件,话单记录以“,”分割,需要统计每个文件的字段有值的数量,无值的数量,输出日志文件;统计完的文件移动到备份目录。 1 遍历文件目录 2 操作每个文件: 统计有值字段、无值字段、 输出日志 将文件移动到备份目录 代码只能在windows下通过: #include <filesystem> #include <iostream> #inc...
2019-06-26 10:15:32 4686
原创 C/C++中STATIC用法总结
一 C语言中static的用法 在C语言中,static的作用主要有两种: 第一个作用是限定作用域;第二个作用是保持变量内容持久化; 1 限定作用域 (1) 全局变量在整个工程文件内都有效;静态全局变量只在定义它的文件内有效;静态局部变量只在定义它的函数内有效,只是程序仅分配一次内存,函数返回后,该变量不会消失;局部变量在定义它的函数内有效,但是函数返回后失效。 (2 在函数返回类型前...
2019-06-26 00:32:26 874
原创 C++命名空间
简介 命名空间是ANSIC++引入的可以由用户命名的作用域,用来处理程序中常见的同名冲突。一个良好的程序应该将程序中的所有实体(变量,类,函数)都放到某个命名空间里。 过去我们用的全局变量可以理解为全局命名空间,独立于所有有名的命名空间之外,它是不需要用namespace声明的,实际上是由系统隐式声明的,存在于每个程序之中。 命名空间的使用 using指令之声明整个命名空间 u...
2019-06-25 09:18:12 127
原创 7 —— std::async()、future、packaged_task、promise
一 std::async()、std::future创建后台任务并返回值 std::async是个函数模板,用来启动一个异步任务。启动起来一个异步任务之后 ,返回一个std::future对象。std::future是个类模板。 什么叫“启动一个异步任务”,就是创建一个线程并开始执行对应的线程入口函数,它返回一个std::future对象,这个对象含有线程入口函数返回的结果。我们可以通过调...
2019-06-24 23:53:27 152
原创 6 ———— 条件变量std::condition_variable
std::condition_variable、notify_one()、wait() 1 std::condition_variable 是一个类模板,仅限于与 std::mutex 一起工作 2 只有使用std::unique_lock对mutex进行管理,因为在条件变量wait()期间,要对mutex解锁。 #include <iostream> #include <t...
2019-06-24 22:21:36 291
原创 5 —— 多线程中的单例模式、std::call_once()
一 多线程中单例模式的实现方法 在多线程中实现单例模式,最好的办法是在主线程中提前初始化好实例,再开启子线程,从而避免子线程间资源竞争的问题。就是大家所说的饿汉模式: 即无论是否调用该类的实例,在程序开始时就会产生一个该类的实例,并在以后仅返回此实例。 class SingletonStatic { private: static const SingletonStatic* m_...
2019-06-19 23:20:35 362
原创 4 —— unique_lock详解
一 unique_lock取代lock_guard unique_lock是个类模板,工作中,一般使用lock_guard。因为unqiue_lock占用的内存更多,效率底一些。但是unique_lock更加灵活,它的构造函数的第二个参数可以有其它的形式,下面会提到。同时,uniuqe_lock与lock_guard一样自动对绑定的互斥量自动加锁,解锁。 二 unique_lock的构造函数 ...
2019-06-19 00:02:05 516
原创 3 —— 多线程的同步和异步
一 创建多个线程 #include <iostream> #include <thread> #include <vector> using namespace std; // 线程入口函数 void myprint(int num) { cout << this_thread::get_id() << "thread star...
2019-06-16 14:21:16 1814 1
原创 2 —— C++多线程传参
一 传递临时对象作为线程参数 示例1 传递临时变量的引用与指针 #include <iostream> #include <thread> using namespace std; void myprint(const int& i, char *str) { cout << i << endl; // --4 cout <&...
2019-06-06 11:07:24 532
原创 1 —— C++11 多线程简介
多线程并发 线程很像轻量级的进程。 在单个进程中运行多个线程,每个线程相互独立运行,且线程可以在不同的指令序列中运行。但进程中的所有线程都共享地址空间,并且所有线程访问到大部分数据———全局变量仍然是全局的,指针、对象的引用或数据可以在线程之间传递。所以一个进程中的两个线程可以通过共享内存进行通信。 由于同一数据的内存地址在不同的进程中是不相同的,所以,进程之间共享内存难以建立,且难以管理...
2019-06-04 18:09:55 464
GDB调试程序-入门级
2019-02-26
vscode怎样包含boost库?
2022-04-12
求正则表达式:匹配不包含"E2564"、"E2462"的字符串
2020-12-14
TA创建的收藏夹 TA关注的收藏夹
TA关注的人