自旋锁(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
20
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

在Windows Phone 8上使用MediaElement的时候发现一个很奇怪的现象。按照MSDN的说法,MediaElement的Volume属性可以通过设置01之间的值来设置媒体音量(0为最小音量,1为最大音量),其默认值为0.5。然而在实际的使用中发现其默认值并不是如MSDN中所说的0.5而是1,且音量并不随着Volume从0到1均匀变化。在00.7之间声音很小几乎听不见,0.7之后开始有明显的声音,且在0.75~1.0这个区间内改变Volume的值音量随Volume的变化明显。

由此看来,音量(z)随Volume属性的值(y)的变化的函数z = g(y)的函数图像近似于指数函数图像沿y轴负方向移动一个单位(因为g(0) = 0)。对于用户来说通过滑动一个范围为0~1的音量条来调节音量,通常用户所期望的是音量(z)能随着音量条的值(x)以一次函数z=h(x)均匀变化,而非以指数函数变化。

由于要改变MediaElement的音量只能通过设置Volume属性来达到,因此需要找到一个合适的转换函数f(x) = y满足z = g(y) = g(f(x)) = h(x) = kx,(其中k为大于1的常数)。

Read More

Windows Phone 8是不支持播放FLV视频文件的。所以用C++写了个FLV视频分离器,目前仅支持AAC音频编码和H.264视频编码,支持拖动播放(仅当metadata中带有关键帧信息)。再由C#对C++进行封装,C#中封装的类继承自MediaStreamSource,最后经由MediaElement播放出来。

【2015/04/06更新】已将源码开放托管于:https://github.com/lxrite/DawnPlayer

附图一张: