服务器
mcc12356
这个作者很懒,什么都没留下…
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
linux内存分配(mmu)以及fork之后父子进程读时共享,写时复制
linux给应用程序首先分配的是虚拟内存,然后再通过 mmu(Memory Management Unit)将虚拟内存映射到物理内存。这样的好处是每一个进程都可以使用4G内存空间(0-3用户态,3-4内核态)。使用fork产生的父子进程读时共享,写时复制。比如在父进程内原来有一个全局变量,如果fork之后父子进程都没有去改变这个变量的值,那么内存中全局区这个变量只会存在一份,所谓读时共享;但是如果fork后父进程或者子进程改变了这个变量的值,那么这个变量将会在内存全局区存在两份,父子进程各自拥有各自的副原创 2020-06-29 10:56:25 · 1270 阅读 · 0 评论 -
C++ 自己代码实现一个递归锁recursive_mutex
之前看过一篇博客讲递归锁的实现,博客链接https://blog.youkuaiyun.com/m18718300471/article/details/79927948但是我测试发现博客中的递归锁实现有问题,因此自己写了一种实现,不一定是最好的,如果有人发现问题或者有更好的写法,欢迎指出来,大家一起讨论交流~递归锁介绍我们都知道,一般的互斥量对于同一个线程只能同时加锁一次(调用lock),如果连续调用两次以上便会出现死锁。你可能会问,为什么会连续调用两次呢,但设想这样一个场景,如果在一个函数内给互斥量上了原创 2020-06-24 17:17:22 · 2099 阅读 · 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 · 1010 阅读 · 0 评论 -
C++ Thread学习四 (使用条件变量condition_variable来实现生产者消费者)
仍然接着我的上一篇博客里的内容https://blog.youkuaiyun.com/mcc12356/article/details/106825972(感兴趣可以去看看),主要是一个写线程往共享队列里写数据,另一个读线程从队列里读数据。当时使用了mutex来实现了对共享队列的保护,但是那里会有一点问题,如果共享队列为空,读队列线程读取不到数据,但仍然可能获取了锁导致写线程被阻塞。那么能否有一种方法使得读线程只有在队列不为空时才能获取锁呢?这时条件变量(condition_variable)就派上了用场。条件变量原创 2020-06-20 17:28:37 · 557 阅读 · 0 评论 -
C++ 实现一个线程安全的单例模式
首先简单介绍一下单例模式。顾名思义,单例模式就是一个类只允许建一个对象,在实际工程中经常会用到。比如一些配置文件的类,多个对象没有意义且浪费资源,所以这时候就可以使用单例模式去实现。C++实现单例模式最简单的方法就是让一个类构造函数私有化,并且内部提供一个公有接口,每当有需要获取这个类的对象的时候就调用此公有接口,返回这个类的对象。代码如下:class Singleton{private: Singleton(){} private: // 此类唯一对象原创 2020-06-19 18:11:43 · 487 阅读 · 0 评论 -
C++ thread学习三 (使用互斥量mutex处理共享数据)
前面我们每个线程只是各自处理各自的数据,或者对于共享数据多个线程只有读操作,并没有写操作,因此不存在任何问题。但是如果线程A,B对同一块内存进行操作,线程A读数据,线程B写数据,如果A读数据前想要的数据还没来得及读,由于cpu时间片切换,B往内存里写了个新数据覆盖掉原来的数据,那么就会出现错误。为了解决这个问题,最简单的办法就是给这块共享内存加上锁,一次只允许一个线程对这块内存进行操作。为了模拟这个问题,创建一个list,其中一个线程不断往这个list里添加数据,另一个线程从该list里读取数据,代原创 2020-06-18 11:37:18 · 373 阅读 · 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 · 389 阅读 · 0 评论 -
mac配置CGI运行程序以及自己踩得坑
CGI(Common Gateway Interface),通用网关接口,它是一段程序,运行在服务器上如:HTTP服务器,提供同客户端HTML页面的接口。mac自带apache server和CGI运行程序,本文将使用自带的apache server和CGI运行程序。mac 启动apache server:sudo apachectl start/restart #启动sudo apachectl stop #停止默认CGI不可用,需要进行相应修改。1.打开httpd.conf文件,..原创 2020-05-30 18:06:39 · 843 阅读 · 1 评论
分享