随笔分类 - C++并发
摘要:转自恋恋风辰大并发服务器框架设计 简单谈一谈大并发服务器框架设计的基本思路 基本的服务器框架都是C/S结构或B/S结构的,请求和相应流程是这样的: 这样的框架存在一个很严重的问题,即当并发量过大时,会阻塞很多请求。当客户端大并发请求到来,服务器需要进行大量的数据库操作,假设数据库最大连接数为1000
阅读全文
摘要:std::timed_mutex包含在<mutex>头文件中。 用法和std::mutex类似。 try_lock_for():等待一段时间,如果拿到了锁,或者超时了未拿到锁,就继续执行(有选择执行)如下 1 std::chrono::milliseconds timeout(100); 2 if
阅读全文
摘要:Windows临界区 Windows临界区,同一个线程是可以重复进入的,但是进入的次数与离开的次数必须相等。C++互斥量则不允许同一个线程重复加锁。windows临界区是在windows编程中的内容,了解一下即可,效果几乎可以等同于c++11的mutex。包含#include <windows.h>
阅读全文
摘要:面向的问题 对简单临界资源的访问,如果使用mutex开销较大。 如有两个线程,对一个变量进行操作,一个线程读这个变量的值,一个线程往这个变量中写值。即使是一个简单变量的读取和写入操作,如果不加锁,也有可能会导致读写值混乱(一条语句可能会被拆成3、4条汇编语句来执行,所以仍然有可能混乱) 1 #inc
阅读全文
摘要:如图以下是头文件<future>中的类容。 std::future<T> future有两个类模板,一个独占的std::future,也就是只能被获取一次,另一个是共享的std::shared_future。std::future<T>是一个类模板,其中T是要存储的值的类型,std::future
阅读全文
摘要:面向的问题 当一个线程等待另一个线程完成任务时,它会有很多选择。 第一,它可以持续的检查共享数据标志(用于做保护工作的互斥量),直到另一线程完成工作时对这个标志进行重设。不过,就是一种浪费:线程消耗宝贵的执行时间持续的检查对应标志,并且当互斥量被等待线程上锁后,其他线程就没有办法获取锁,这样线程就会
阅读全文
摘要:转自princetengC++多线程——读写锁shared_lock/shared_mutex 何为读写锁 相比互斥锁,读写锁允许更高的并行性,互斥量要么锁住状态要么不加锁,而且一次只有一个线程可以加锁。读写锁可以有三种状态: 读模式加锁状态; 写模式加锁状态; 不加锁状态; 只有一个线程可以占有写
阅读全文
摘要:需要保护的初始化举例 如对单例模式的初始化。 1 #include <iostream> 2 #include <thread> 3 #include <mutex> 4 5 using namespace std; 6 7 //单例模式 8 class MySingleTon{ 9 public:
阅读全文
摘要:保护共享数据的最基本的方式,是使用C++标准库提供的互斥量(头文件<mutex>)。当访问共享数据前,使用互斥量将相关数据锁住,再当访问结束后,再将数据解锁。线程库需要保证,当一个线程使用特定互斥量锁住共享数据时,其他的线程想要访问锁住的数据,都必须等到之前那个线程对数据进行解锁后,才能进行访问。这
阅读全文
摘要:lock_guard<T> 使用的RAII机制,互斥量在lock_guard<T>对象构造时lock,在其析构时unlock。主要是为了解决在手动lock和unlock时忘记unlock的情况。lock_guard类不可复制,因为一个对象只能关联一个mutex。 锁的粒度 锁的粒度用来描述通过一个锁
阅读全文
摘要:C++标准库中有很多资源占有(resource-owning)类型,比如 std::ifstream , std::unique_ptr 还有 std::thread 都是可移动(movable),但不可拷贝(cpoyable)。虽然, std::thread 实例不会如 std::unique_p
阅读全文
摘要:线程可以共享进程的内存空间,线程拥有自己独立内存。 关于参数的传递,std::thread的构造函数只会单纯的复制传入的变量,特别需要注意的是传递引用时,传入的是值的副本,也就是说子线程中的修改影响不了主线程中的值。 值传递 主线程中的值,被拷贝一份传到了子线程中。 1 #include <iost
阅读全文
摘要:基础 detach()的作用是将子线程和主线程的关联分离,也就是说detach()后子线程在后台独立继续运行,主线程无法再取得子线程的控制权,即使主线程结束,子线程未执行也不会结束。当主线程结束时,由运行时库负责清理与子线程相关的资源。实际应用如让一个文字处理应用同时编辑多个文档,让每个文档处理窗口
阅读全文
摘要:基础 join()函数的作用是让主线程的等待该子线程完成,然后主线程再继续执行。这种情况下,子线程可以安全的访问主线程中的资源。子线程结束后由主线程负责回收子线程资源。一个子线程只能调用join()和detach()中的一个,且只允许调用一次。可以调用joinable()来判断是否可以成功调用joi
阅读全文
摘要:创建线程 子线程在创建时启动。使用功能std::thread类创建线程对象。 线程关联的可调对象可以是:普通函数、仿函数对象、Lambda表达式、非静态成员函数、静态成员函数。 示例 普通函数 1 #include <thread> 2 #include <iostream> 3 4 using n
阅读全文

浙公网安备 33010602011771号