编译环境

此次编译使用的是Windows Azure的虚拟机,基本的配置信息是这样的。

项目 信息
操作系统 Ubuntu 14.04 LTS (GNU/Linux 3.13.0-27-generic x86_64)
处理器频率(MHz) 2094.651
处理器核心数 2
内存(GB) 3.5

准备工作

1.一个支持ISO C++98的C++编译器

Read More

我原先并不知道std::integer_sequence有什么用,直到我的膝盖中了一箭。

元组(Tuple)

元组是一种长度固定的允许有不同类型元素的集合,根据元素的个数不同又分别称作一元组、二元组、三元组等。C++11中标准库增加了一个叫std::tuple的类模板,用于表示元组。下面的代码演示了使用C++创建一个三元组。

1
2
3
4
5
6
7
8
auto tuple = std::make_tuple(1, 'A', "破晓的博客");
std::cout << std::get<0>(tuple) << std::endl;
std::cout << std::get<1>(tuple) << std::endl;
std::cout << std::get<2>(tuple) << std::endl;
// 下面是C++14的特性
std::cout << std::get<int>(tuple) << std::endl;
std::cout << std::get<char>(tuple) << std::endl;
std::cout << std::get<const char*>(tuple) << std::endl;

输出

1
2
3
4
5
6
1
A
破晓的博客
1
A
破晓的博客

许多编程语言如C#、Python等也有tuple的概念。下面的代码演示了使用Python创建一个三元组。

1
2
3
4
t = (1, 'A', "破晓的博客")
print(t[0])
print(t[1])
print(t[2])

输出

1
2
3
1
A
破晓的博客

Python从语言级别上支持将tuple展开为函数的参数,在Python中假设定义有这样一个函数func和一个元组t,下面的代码演示了将元组t的每个元素作为func函数的参数。

1
2
3
4
def func(arg1, arg2, arg3):
print(arg1, arg2, arg3)
t = (1, 'A', "破晓的博客")
func(*t)

Read More

自旋锁(Spinlock)

自旋锁是一种用于保护多线程共享资源的锁,与一般的互斥锁(mutex)不同之处在于当自旋锁尝试获取锁的所有权时会以忙等待(busy waiting)的形式不断的循环检查锁是否可用。在多处理器环境中对持有锁时间较短的程序来说使用自旋锁代替一般的互斥锁往往能提高程序的性能。

自旋锁的原理

自旋锁有两种基本状态:

  1. 锁定状态
    锁定状态又称不可用状态,当自旋锁被某个线程持有时就是锁定状态,在自旋锁被释放之前其他线程不能获得锁的所有权。
  2. 可用状态
    当自选锁未被任何线程持有时的状态就是可用状态。

    Read More

前言

学习C++11的多线程已经有一段时间了,所以打算整理记录下来,分成五篇文章:
一、标准库的线程封装类Thread和Future
二、互斥对象(Mutex)和锁(Lock)
三、条件变量(Condition Variable)
四、原子操作(Atomic Operation)
五、内存序(Memory Order)

多线程概述

线程(Thread)是程序中独立执行的指令流,通常是系统调度的基本单位。含有两个或两个以上线程的程序就称为多线程程序,在硬件允许的情况下多个线程可以彼此独立的并行执行。在许多情况下都需要使用多线程,比如:

  1. 程序需要进行一些IO操作,IO操作通常需要一些时间才能完成,在这段时间线程就会被阻塞(Block)。使用多线程就可以启动一个新的线程去等待IO操作完成,而当前线程就可不被阻塞的继续执行别的工作;
  2. 在多核心处理器的机器上执行计算密集型的程序。使用多线程就可以将计算工作切分成多个独立的计算工作交给多个线程在CPU的不同核心上并行计算。
    C++11开始提供了对多线程的支持。标准库提供了std::thread类来创建和管理线程,std::future类模板来获取异步操作的结果。

    Read More

Unicode

Unicode是计算机领域的一项行业标准,它对世界上绝大部分的文字的进行整理和统一编码,Unicode的编码空间可以划分为17个平面(plane),每个平面包含2的16次方(65536)个码位。17个平面的码位可表示为从U+0000到U+10FFFF,共计1114112个码位,第一个平面称为基本多语言平面(Basic Multilingual Plane, BMP),或称第零平面(Plane 0)。其他平面称为辅助平面(Supplementary Planes)。基本多语言平面内,从U+D800到U+DFFF之间的码位区段是永久保留不映射到Unicode字符,所以有效码位为1112064个。最新的版本是Unicode 6.3发布于2013年9月30日。

Unicode的编码方式

对于被Unicode收录的字符其编码是唯一且确定的。但是Unicode的实现方式(出于传输、存储、处理或向后兼容的考虑)却有不同的几种,其中最流行的是UTF-8、UTF-16、UCS2、UCS4/UTF-32等,细分的话还有大小端的区别。

Read More

抱歉,不再提供在线转换服务。

示例链接:

  • http://x.poxiao.me:1234/189224990/3BA3B4EA759CA9043F887B1B29985677DB38AD03/东京暗鸦_2013_HDTV_01.mp4
  • http://x.poxiao.me:1234/115932953/8D0238A835768073BE0DC3BB946E8AD24F89C92A/东京暗鸦_2013_HDTV_02.mp4

使用说明:
并不是任何http链接都可以转换成qvod链接,只有形如http://host[:port]/file_size/http_hash/file_name的链接才能转换。将快播的http链接输入上方的文本区域,每行一条链接,支持批量转换,点击下方的转换按钮即可完成转换。

Read More

抱歉,不再提供在线转换服务。

示例链接:

  • bdhd://2559345489|F34F589105A0013F7183DAF43A69ED08|神都龙王BD1280超清国语中字.mkv
  • qvod://1563259159|2B72E2C4CA7C787E480F694E0D10D6D946492012|金刚狼2.rmvb|

使用说明:
将qvod链接或bdhd链接输入入上方的文本区域,每行一条链接,支持批量转换,支持qvod和bdhd混合转换,点击下方的转换按钮即可完成转换。

Visual C++ Nov 2013 CTP

微软在这周发布了Visual C++ Nov 2013 CTP,包含了下面这些C++11、C++14和C++/CX新特性:

  • Implicit move special member function generation (thus also completing =default)
  • Reference qualifiers on member functions (a.k.a. “& and && for *this”)
  • Thread-safe function local static initialization (a.k.a. “magic statics”)
  • Inheriting constructors
  • alignof/alignas
  • __func__
  • Extended sizeof
  • constexpr (except for member functions)
  • noexcept (unconditional)
  • C++14 decltype(auto)
  • C++14 auto function return type deduction
  • C++14 generic lambdas (with explicit lambda capture list)
  • (Proposed for C++17) Resumable functions and await

Implicit move special member function generation

在C++03中default关键字用于在switch语句中声明default case。在C++11中增加了让编译器为类生成默认构造函数、移动构造函数、赋值操作符、移动操作符和析构函数的功能。
比如在C++11中可以这样声明一个wrapper类

Read More

SRT文件

.srt是一种非常流行的基于文本行格式的字幕文件。一个简单的字幕文件的内容如下(本文不考虑字幕有多行的情况):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
1
00:00:53,477 --> 00:00:54,845
大唐

2
00:00:55,212 --> 00:00:57,280
我夙夜忧思的母国

3
00:00:58,615 --> 00:00:59,750
洛阳

4
00:01:00,250 --> 00:01:02,419
我魂萦梦系之地

5
00:01:05,389 --> 00:01:06,890
三十岁那年

其内容包括序号,开始时间和结束时间,以及字幕的文本内容,以\r\n相互隔开,最后以\r\n\r\n结束,这样的格式很容易通过正则表达式匹配来解析。

Read More

今天把客户端更新到了2.0.5.110,插队下载在这个版本得到了回归,而整合的迅雷云播则着实让我无力吐槽。

  • 整合的云播和Web版的云播基本功能相同,左侧的云播记录相当于Web版的全部任务,收藏相当于Web版的隐藏任务。增加了一个Web版所没有的我的好友。在这个页面可以使用雷达搜索附近的人(说是附近但其实能精确到和你同一个县级市或区就不错了,毕竟PC不像手机可以用GPRS来定位)。鼠标移动到ta的名片上就会显示出ta最近使用云播观看的3部影片的文件名,不管你愿不愿意,你最近看的3部影片的文件名都会在那个地方显示。当然被你扫到了然后又被你看到了我最近观看的影片这并没什么大问题,因为通常我被你扫到了你也不知道我是谁。但是在搜索附近的人的上面有个按帐号查找的,这个目的性就很强了,查到后就可以不需要加对方为好友就能知道对方最近看了什么片子,对于注重隐私的人来说,这是一个难以接受的设定,至少我认为通过帐号直接搜索的应该应该设定为在好友请求被通过后才能查看对方的播放记录。最奇葩的是右上角有个举报按钮,我只能说“卧槽,这又不是我主动分享的,你举报我干嘛!”。

    Read More