自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(11)
  • 收藏
  • 关注

原创 Linux 多进程/多线程同时write()一个文件及O_APPEND参数实验验证

基于该博客的结论进行实验验证首先需要各位前去看链接中的博客,了解里面的结论和知识点再来看我的实验验证。write调用能保证的是,不管它实际写入了多少数据,比如写入了n字节数据,在写入这n字节数据的时候,在所有共享文件描述符的线程或者进程之间,每一个write调用是原子的,不可打断的。举一个例子,比如线程1写入了3个字符’a’,线程2写入了3个字符’b’,结果一定是‘aaabbb’或者是‘bb...

2019-12-29 17:51:30 3176 5

原创 effectiv c++条款1-11

条款2: 尽量以const, enum, inline 替换#define#define port 8888define可以定常量值,但是它没有作用域,并且它是直接被替换,如果是大型项目,报错显示的是8888而不是port,导致无法追踪该错误。这个问题也会出现在记号表调试中,define的常量没有进入记号表中。具体原因可以看ELF文件解析。define不能被封装,而const可以被封装在...

2019-12-28 21:49:20 227

原创 listen函数及其backlog参数的含义及实验验证

listen函数仅由TCP服务器调用,它做两件事情(1)当socket函数创建一个套接字时,它被假设为一个主动套接字,也就是说,它是一个将调用connect发起连接的客户套接字。listen函数把一个未连接的套接字转换成一个被动套接字,指示内核应接受指向该套接字的连接请求。调用listen导致套接字从CLOSED状态转换到LISTEN状态。(2)本函数的第二个参数规定了内核应该为响应套接字排队...

2019-12-28 17:03:41 642

原创 从Linux内核谈僵尸进程

僵尸进程摘自百度百科:僵尸进程是当子进程比父进程先结束,而父进程又没有回收子进程,释放子进程占用的资源,此时子进程将成为一个僵尸进程。如果父进程先退出 ,子进程被init接管,子进程退出后init会回收其占用的相关资源。在UNIX 系统中,一个进程结束了,但是他的父进程没有等待(调用wait / waitpid)他, 那么他将变成一个僵尸进程。 但是如果该进程的父进程已经先结束了,那么该进...

2019-12-24 21:19:43 251

转载 Linux线程实现机制

一.基础知识:线程和进程按照教科书上的定义,进程是资源管理的最小单位,线程是程序执行的最小单位。在操作系统设计上,从进程演化出线程,最主要的目的就是更好的支持SMP以及减小(进程/线程)上下文切换开销。无论按照怎样的分法,一个进程至少需要一个线程作为它的指令执行体,进程管理着资源(比如cpu、内存、文件等等),而将线程分配到某个cpu上执行。一个进程当然可以拥有多个线程,此时,如果进程运行在S...

2019-12-18 10:48:32 681

原创 利用shared_ptr和互斥锁来模拟读写锁

读写锁读写锁有三种状态:读模式下加锁状态,写模式下加锁状态,不加锁状态。一次只有一个线程可以占有写模式的读写锁,但是多个线程可以同时占有读模式的读写锁。当占有读写锁的读锁时,任何线程希望以写模式对此锁进行加锁时都会阻塞,但是这种情况下,读写锁通常会阻塞随后的读锁请求,这样可以避免读模式锁长期占用,而等待的写模式锁一直得不到满足。当读写锁是写加锁状态时,在这个锁被解锁之前,所有试图对这个锁加锁的线...

2019-12-17 20:49:31 469

原创 浅谈Linux内核与线程的关系及线程调度

首先,文章的开篇我们先看几个概念用户级线程用户级线程顾名思义就是用户态下的线程,用户线程的建立,同步,销毁,调度完全在用户空间完成,不需要内核的帮助。因此这种线程的操作是极其快速的且低消耗的。内核线程内核级线程,是指由内核管理的线程多线程模型多对一这种模型下创建的许多用户线程就会如下图所示。优点就是创建的代价非常小缺点也很明显,当一个线程阻塞住,该内核上的其它用户线程也会阻塞。...

2019-12-17 15:31:37 1328

原创 c++中线程传递函数为什么是全局或者静态函数

首先,线程也是一种资源,受系统调度。在计算机中,运行程序都是通过地址来运行,所以,我们必须告知计算机该线程的起始地址,也就是传入函数的地址,所以函数应为全局函数或者静态函数。在c++中,传入线程的函数可能是类中的函数,如果类中的函数不加static进行修饰,可以吗?答案是不可以的。因为在类中,参数列表中都会有一个this指针,例如函数foo(int),在编译之后就会变成foo(int, cla...

2019-12-15 19:56:54 1403

原创 c++11多线程 std::async的使用总结

std::async#include<future>template<class Fn, class... Args>future<typename result_of<Fn(Args...)>::type> async(launch policy, Fn&& fn, Args&&...args);该函数包含...

2019-12-09 17:02:48 795 1

原创 c++11线程的使用坑点总结

坑点总结1、启动了线程,你需要明确是要等待线程结束(调用join),还是让其自主运行(调用detach)。如果std::thread对象销毁之前还没有做出决定,程序就会终止(std::thread的析构函数会调用std::terminate())。因此,即便是有异常存在,也需要确保线程能够正确的加入(joined)或分离(detached)。。需要注意的是,必须在std::thread对象销毁之...

2019-12-03 21:24:11 1309

原创 浅谈ELF文件

首先我们知道程序经过编译器例如gcc,在打下gcc 1.c的时候经历了什么,分为如下四步预处理主要处理那些以’#‘开始的指令1、将所有#define展开2、处理所有预编译条件指令。#ifdef等3、处理’#include’预编译指令,将被包含的文件插入到该预编译指令的位置。这个过程是递归的,可能会包含重复的头文件。(所有需要#ifndef #define)4、删除所有注释。保留所有#p...

2019-12-02 11:26:33 329

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除