C++中实现多线程安全的单体类

最近看了一些算是比较高大上的C++代码,被内力震伤了,赶紧记录下来!最最基础的就是这个:单体类。单体是面向对象中一种非常流行的设计模式,C++的实现百度一下可以找到一坨,但这个稍稍有点特殊——多线程安全。

普通版本的单体类实现如下:

乍一看似乎完全没有问题,不过如果这个单体类运行在多线程环境中,将会有可能创建多个实例。临界区出现在Instance()函数中创建单体对象的部分,即静态变量m_Instance!当访问该变量判断单体是否已被创建时,如果不进行临界区保护,很有可能会造成多个线程同时进入临界区,创建了多个Singleton对象,Boom…

继续阅读:

[转]What is a Full Stack developer?

临睡前转一篇文章,经常看看,提醒自己:不要给自己设限!我可以做的更多更好。
本文转自:Laurence Gellert’s Blog


Is it reasonable to expect mere mortals to have mastery over every facet of the development stack? Probably not, but Facebook can ask for it. I was told at OSCON by a Facebook employee that they only hire ‘Full Stack’ developers. Well, what does that mean?

To me, a Full Stack Developer is someone with familiarity in each layer, if not mastery in many and a genuine interest in all software technology.

Good developers who are familiar with the entire stack know how to make life easier for those around them. This is why I’m so against silos in the work place. Sure, politics and communication challenges get in the way in large organizations. I think the point Facebook is going for with their hiring policy is, if smart people use their heads and their hearts, a better product gets built in less time.

继续阅读:

OpenStack奇葩配置:Flat network with external DHCP

最近对实验室的实验用OpenStack环境进行调整,遇到的最大的阻力来自于系楼网络的特殊性:系楼网络采用强制DHCP的模式,这就意味着我没有办法通过手工设定IP地址的方式来使用虚拟机——即使这个IP地址是可用的。

OpenStack似乎没有针对这种情况的网络模式(即使FlatManager也不行),因为所有的网络模式都需要在虚拟机创建时就可以确定虚拟机的IP,这一点在系楼的网络中是做不到的,同时在系楼中也不能做到拥有可以自己管理的预留IP,所以floating IP的概念也拜拜了。

折腾了一段时间以后总算是找到了一种非常规的解决方案:在FlatManager的基础上通过合并内部网和外部网来达到把虚拟机和物理服务器置于同一网络中的目的。

注:下文中所有配置均针对icehouse版本。

继续阅读:

在LVM上修改卷大小

实验室的服务器是CentOS6.4的系统,默认采用了LVM。这带来了很大的便利,灵活的卷调整是其中之一。有关于LVM的介绍在这里

碰巧需要对卷大小进行一次调整,CentOS默认安装为”/home”分配了较大的卷而”/”分配了较小的卷,这不符合目前实验室的使用需求,因此需要对卷大小进行调整,过程记录如下。

继续阅读:

Largest Rectangle in Histogram

Given n non-negative integers representing the histogram’s bar height where the width of each bar is 1, find the area of largest rectangle in the histogram.
histogram
Above is a histogram where width of each bar is 1, given height = [2,1,5,6,2,3].
histogram_area
The largest rectangle is shown in the shaded area, which has area = 10 unit.

For example,
Given height = [2,1,5,6,2,3],
return 10.

题目链接在这里

继续阅读:

Copy List with Random Pointer

A linked list is given such that each node contains an additional random pointer which could point to any node in the list or null.

Return a deep copy of the list.

题目链接在这里

题目要求对链表进行复制,不过这个链表稍微有点特殊:在每一个节点中除了指向下一个节点的指针,还有一个指向链表中随机节点的指针,如下:

这个链表看起来大概是这个样子:

带有随机指针的链表

带有随机指针的链表

这个随机指针对链表的拷贝造成了不小的麻烦…

继续阅读:

Single Number

Given an array of integers, every element appears twice except for one. Find that single one.

Note:
Your algorithm should have a linear runtime complexity. Could you implement it without using extra memory?

题目链接在这里

这是一道很有意思的题目,大意是说在一个整型数组中,所有的数字都出现了两次,只有一个数是例外,找出这个数。

乍一看感觉很简单啊,开个数组计数就好了~可惜题目还要求要在不使用额外空间的情况下找到解,这就有点蛋疼了…如果使用二分查找倒是不会用到额外空间,可是时间复杂度为O(nlogn),又不符合题目要求的线性复杂度…

该怎么办呢?该怎么办呢?

继续阅读:

来自Swift的hello,world!

一觉醒来,所有的新闻媒体都充斥着Swift,不过这个Swift可不是那个女歌手Swift,而是apple在WWDC2014上刚刚发布的新编程语言:Swift

WWDC2014推出Swift编程语言

WWDC2014推出Swift编程语言

Swift是什么?

突然冒出一个新语言,这感觉…还是先来看看苹果怎么说:

Swift is an innovative new programming language for Cocoa and Cocoa Touch. Writing code is interactive and fun, the syntax is concise yet expressive, and apps run lightning-fast. Swift is ready for your next iOS and OS X project — or for addition into your current app — because Swift code works side-by-side with Objective-C.

是不是有一种不明觉厉的感觉!简单来说Swift是一个运行效率高、并且具有多种现代语言特性、可以和Objective-C一起使用的用来开发iOS和OS X应用的新语言。

继续阅读:

Nanos note 2 : 内核初始化

上一篇文章中,我们已经完成了bootloader的运行:设置内核段描述符、进入保护模式、载入ELF格式内核,并将控制交给内核代码。
但是,此时操作系统的启动过程并未完全完成,本篇文章接着bootloader完成的工作,还是以Nanos为范例,具体的分析一下操作系统内核的初始化过程(内核初始化所使用的代码可以在Nanos的github找到,见这里)。
内核初始化主要完成了下面这些工作:

  1. 初始化时钟
  2. 初始化可编程中断控制器
  3. 初始化中断描述符表(IDT)

继续阅读: