![](https://img-blog.csdnimg.cn/20201014180756926.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
C++
mcc12356
这个作者很懒,什么都没留下…
展开
-
c++静态链接以及动态链接的区别
在linux系统里,静态链接(.a)文件是通过将被链接的库文件拷贝一份的方法,提供给应用程序使用的。应用程序在编译的时候,静态库的源文件会被拷贝一份放到应用程序里,因此如果库升级之后,需要将应用程序重新编译。同时如果多个应用程序使用同一个静态库,那么内存中会存在这个静态库文件的多个副本。动态链接(.so)文件是将库文件直接放到内存中,如果应用程序需要使用,到执行的时候才会去内存中读取动态库文件,如果库升级之后,应用程序无需重新编译,会直接切换到动态库最新的版本。在两种连接方式的选择方面,如果从节省内原创 2021-04-02 11:17:33 · 416 阅读 · 0 评论 -
C++ 自己代码实现一个递归锁recursive_mutex
之前看过一篇博客讲递归锁的实现,博客链接https://blog.csdn.net/m18718300471/article/details/79927948但是我测试发现博客中的递归锁实现有问题,因此自己写了一种实现,不一定是最好的,如果有人发现问题或者有更好的写法,欢迎指出来,大家一起讨论交流~递归锁介绍我们都知道,一般的互斥量对于同一个线程只能同时加锁一次(调用lock),如果连续调用两次以上便会出现死锁。你可能会问,为什么会连续调用两次呢,但设想这样一个场景,如果在一个函数内给互斥量上了原创 2020-06-24 17:17:22 · 1925 阅读 · 2 评论 -
C++ thread学习四(使用async创建线程并返回结果)
使用async创建一个新线程,返回一个future类型的对象,可以使用这种方法从线程中返回值。基本语法为:std::future<线程函数返回值类型> res = std::async(标记, 线程入口函数);标记常用的有std::launch::deferred和std::launch::async。std::launch::async:为系统默认缺省参数(如果不加标记,系统默认会加上这个),意思是为当执行此行语句时线程被创建并开始执行,但是如果此线程没有被执行完,会被阻塞在res原创 2020-06-21 10:11:26 · 903 阅读 · 0 评论 -
C++ Thread学习四 (使用条件变量condition_variable来实现生产者消费者)
仍然接着我的上一篇博客里的内容https://blog.csdn.net/mcc12356/article/details/106825972(感兴趣可以去看看),主要是一个写线程往共享队列里写数据,另一个读线程从队列里读数据。当时使用了mutex来实现了对共享队列的保护,但是那里会有一点问题,如果共享队列为空,读队列线程读取不到数据,但仍然可能获取了锁导致写线程被阻塞。那么能否有一种方法使得读线程只有在队列不为空时才能获取锁呢?这时条件变量(condition_variable)就派上了用场。条件变量原创 2020-06-20 17:28:37 · 453 阅读 · 0 评论 -
C++ 实现一个线程安全的单例模式
首先简单介绍一下单例模式。顾名思义,单例模式就是一个类只允许建一个对象,在实际工程中经常会用到。比如一些配置文件的类,多个对象没有意义且浪费资源,所以这时候就可以使用单例模式去实现。C++实现单例模式最简单的方法就是让一个类构造函数私有化,并且内部提供一个公有接口,每当有需要获取这个类的对象的时候就调用此公有接口,返回这个类的对象。代码如下:class Singleton{private: Singleton(){} private: // 此类唯一对象原创 2020-06-19 18:11:43 · 385 阅读 · 0 评论 -
c++ 类静态成员初始化
类静态成员是被该类所有对象共享的数据,必须在类外初始化。(如果在类内初始化的话则每个对象都会去初始化该成员,因此会报错)。class A{public: // static int a = 0; //错误写法 static int a;};int B::a = 0;如果是静态常量成员则两种写法都可以。(因为常量只会被初始化一次)class A{public: static const int a = 0;};...原创 2020-06-19 10:47:18 · 289 阅读 · 0 评论 -
C++ thread学习三 (使用互斥量mutex处理共享数据)
前面我们每个线程只是各自处理各自的数据,或者对于共享数据多个线程只有读操作,并没有写操作,因此不存在任何问题。但是如果线程A,B对同一块内存进行操作,线程A读数据,线程B写数据,如果A读数据前想要的数据还没来得及读,由于cpu时间片切换,B往内存里写了个新数据覆盖掉原来的数据,那么就会出现错误。为了解决这个问题,最简单的办法就是给这块共享内存加上锁,一次只允许一个线程对这块内存进行操作。为了模拟这个问题,创建一个list,其中一个线程不断往这个list里添加数据,另一个线程从该list里读取数据,代原创 2020-06-18 11:37:18 · 266 阅读 · 0 评论 -
select I/O复用实现简单web服务器
简单web服务器模型要想实现一个简单的web服务器模型,一般有以下几种方法:1. 多进程(主进程监听,有新的连接就fork一个子进程建立连接)2. 多线程(主线程监听,有新的连接就新建一个子线程建立连接)3. 使用系统函数select去监听,当有文件描述符就绪对其进行处理4. 使用系统函数poll去监听,当有文件描述符就绪对其进行处理5. 使用系统函数epoll去监听,当有文件描述符就绪对其进行处理3,4,5都是单线程,基本原理就是有一个线程在监听是否有新的客户端请求,如果有的话原创 2020-06-12 10:19:50 · 320 阅读 · 0 评论 -
C++ thread学习二(一些避免出现的坑)
1. 如果要main thread使用detach方法,尽量不传递引用,一定不能传递指针。#include <iostream>using namespace std;#include "thread"#include <unistd.h>//此时ref虽然是引用,却是值传递,因此即使main thread用的detach并且回收了变量ref内存,不会影响thread里ref的值//此时pointer是地址传递m,因此如果如果main thread 提前退出,会将po原创 2020-06-02 21:18:39 · 401 阅读 · 0 评论 -
C++ thread学习一(利用C++11 thread创建线程)
之前几次学习多线程但都没有学到最后,今天重启C++多线程学习计划,希望可以坚持到最后。首先简单介绍一下进程以及线程。进程是系统资源分配的最小单位,线程是cpu执行的最小单位。简单来说,一个可执行程序运行起来就是一个进程,一个进程可能包含多个线程,一个进程一定有一个主线程,就相当于main函数,是程序的入口。1. 创建一个线程#include <iostream>using namespace std;#include "thread"void threadTest(){原创 2020-06-01 17:08:51 · 1215 阅读 · 0 评论