<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
  <title>破晓的博客</title>
  <icon>https://blog.poxiao.me/icon.png</icon>
  
  <link href="https://blog.poxiao.me/atom.xml" rel="self"/>
  
  <link href="https://blog.poxiao.me/"/>
  <updated>2024-04-29T14:21:39.482Z</updated>
  <id>https://blog.poxiao.me/</id>
  
  <author>
    <name>破晓</name>
    
  </author>
  
  <generator uri="https://hexo.io/">Hexo</generator>
  
  <entry>
    <title>Rust是如何保证并发安全的</title>
    <link href="https://blog.poxiao.me/p/how-does-rust-guarantee-memory-safe-in-concurrency/"/>
    <id>https://blog.poxiao.me/p/how-does-rust-guarantee-memory-safe-in-concurrency/</id>
    <published>2015-04-19T08:07:54.000Z</published>
    <updated>2024-04-29T14:21:39.482Z</updated>
    
    
    <summary type="html">&lt;p&gt;关注Rust语言已经有段时间了，距离Rust 1.0发布也只剩一个月不到的时间了，所以就写篇Rust并发相关的文章吧。&lt;/p&gt;
&lt;p&gt;Rust官方博客在几天前发布的一篇名为&lt;a href=&quot;http://blog.rust-lang.org/2015/04/10/Fearless-Concurrency.html&quot;&gt;Fearless Concurrency with Rust&lt;/a&gt;的文章，从这篇文章可以看出Rust在并发的内存安全上做了很多努力，Rust通过在编译期对&lt;code&gt;所有权(ownership)&lt;/code&gt;和&lt;code&gt;生命期(lifetime)&lt;/code&gt;等进行静态检查以确保并发安全。本文主要是记录博主对于这篇文章的一些见解。&lt;/p&gt;
&lt;p&gt;使用Rust来写并发程序，可以受益于下面这些好处。&lt;/p&gt;</summary>
    
    
    
    <category term="Rust" scheme="https://blog.poxiao.me/category/rust/"/>
    
    
    <category term="Concurrency" scheme="https://blog.poxiao.me/tag/concurrency/"/>
    
    <category term="Rust" scheme="https://blog.poxiao.me/tag/rust/"/>
    
    <category term="多线程" scheme="https://blog.poxiao.me/tag/multi-threading/"/>
    
  </entry>
  
  <entry>
    <title>开源一个用于在Windows Phone上播放FLV视频文件的库</title>
    <link href="https://blog.poxiao.me/p/open-source-a-flv-playback-library-for-windows-phone/"/>
    <id>https://blog.poxiao.me/p/open-source-a-flv-playback-library-for-windows-phone/</id>
    <published>2015-03-31T15:05:51.000Z</published>
    <updated>2024-04-29T14:21:39.484Z</updated>
    
    
    <summary type="html">&lt;p&gt;事实上早在2013年的时候博主就实现了&lt;code&gt;不依赖任何第三方库&lt;/code&gt;在WP8上播放FLV格式的视频文件（见&lt;a href=&quot;/p/wp8-streaming-flv-h264-aac/&quot;&gt;这篇文章&lt;/a&gt;），只不过当时没有将源代码开放出来。时间过去了将近两年，但是似乎在GitHub上依然没有开源的方便易用的这方面的库，所以博主决定将这个库重写一遍开源出来。代码托管在&lt;a href=&quot;https://github.com/lxrite/DawnPlayer&quot;&gt;GitHub&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;这个库支持Windows Phone Silverlight应用和Windows Runtime Universal应用，前者面向Windows Phone 8+，后者面向Windows Phone 8.1+和Windows 8.1+。&lt;/p&gt;
&lt;h2 id=&quot;如何使用&quot;&gt;&lt;a href=&quot;#如何使用&quot; class=&quot;headerlink&quot; title=&quot;如何使用&quot;&gt;&lt;/a&gt;如何使用&lt;/h2&gt;&lt;p&gt;这个库以简单易用为设计目标，在你的项目中使用这个库只需要写数行代码。&lt;/p&gt;</summary>
    
    
    
    <category term="WindowsPhone" scheme="https://blog.poxiao.me/category/windowsphone/"/>
    
    
    <category term="C++" scheme="https://blog.poxiao.me/tag/cpp/"/>
    
    <category term="C#" scheme="https://blog.poxiao.me/tag/csharp/"/>
    
    <category term="FLV" scheme="https://blog.poxiao.me/tag/flv/"/>
    
    <category term="MediaElement" scheme="https://blog.poxiao.me/tag/mediaelement/"/>
    
  </entry>
  
  <entry>
    <title>Wow64（32位进程）注入DLL到64位进程</title>
    <link href="https://blog.poxiao.me/p/wow64-process-inject-dll-into-x64-process/"/>
    <id>https://blog.poxiao.me/p/wow64-process-inject-dll-into-x64-process/</id>
    <published>2015-01-11T13:16:14.000Z</published>
    <updated>2024-04-29T14:21:39.486Z</updated>
    
    
    <summary type="html">&lt;h2 id=&quot;DLL注入&quot;&gt;&lt;a href=&quot;#DLL注入&quot; class=&quot;headerlink&quot; title=&quot;DLL注入&quot;&gt;&lt;/a&gt;DLL注入&lt;/h2&gt;&lt;p&gt;向其他进程注入DLL通常的做法是通过调用&lt;code&gt;CreateRemoteThread&lt;/code&gt;这个API在目标进程内创建一个远程线程，用这个线程来调用&lt;code&gt;LoadLibraryA&lt;/code&gt;或&lt;code&gt;LoadLibraryW&lt;/code&gt;（下文统称LoadLibrary）以实现让目标进程加载指定的DLL文件。使用CreateRemoteThread创建一个远程线程需要传入一个线程过程函数的地址，并且这个函数地址是需要在目标进程中有效的。由于LoadLibrary是kernel32.dll的导出函数，所以对于运行在同一个系统上的同为32位的进程或同为64位的进程可以假定彼此进程内的LoadLibrary函数的地址是相同的。并且CreateRemoteThread的线程过程函数和LoadLibrary的参数个数相同，且参数都是指针，因此通常都是直接将LoadLibrary作为CreateRemoteThread的过程函数。然后使用&lt;code&gt;VirtualAllocEx&lt;/code&gt;在目标进程中分配内存，使用&lt;code&gt;WriteProcessMemory&lt;/code&gt;往这块内存中写入DLL文件路径，将这块内存的地址作为线程过程函数（LoadLibrary）的参数。&lt;/p&gt;
&lt;p&gt;在64位的Windows操作系统上32位进程中的LoadLibrary函数地址与64位进程的函数地址不同，因此如果想对64位进程注入DLL，简单的做法就是使用64位进程来执行注入工作。但是如果能让32位进程注入DLL到64位进程显然更好。&lt;/p&gt;</summary>
    
    
    
    <category term="Windows" scheme="https://blog.poxiao.me/category/windows/"/>
    
    
    <category term="Windows" scheme="https://blog.poxiao.me/tag/windows/"/>
    
    <category term="C++" scheme="https://blog.poxiao.me/tag/cpp/"/>
    
  </entry>
  
  <entry>
    <title>写了个允许从Lua直接调用任意Windows API的库</title>
    <link href="https://blog.poxiao.me/p/a-library-allows-lua-code-to-call-windows-api-directly/"/>
    <id>https://blog.poxiao.me/p/a-library-allows-lua-code-to-call-windows-api-directly/</id>
    <published>2014-11-30T13:58:32.000Z</published>
    <updated>2024-04-29T14:21:39.481Z</updated>
    
    
    <summary type="html">&lt;p&gt;&lt;code&gt;Lua&lt;/code&gt;是一个轻量级的脚本语言，其设计目标是容易嵌入其他编程语言中去，不依赖任何第3方库使用标准C写成，因此具有很好的可移植性，并且其性能在脚本类语言中也是首屈一指的。lua自身的标准库只提供了一些非常基本且有限的功能，因此单纯使用lua能做的事情并不多，但是lua被设计成很容易由C来扩展它的功能。&lt;/p&gt;
&lt;h2 id=&quot;动机&quot;&gt;&lt;a href=&quot;#动机&quot; class=&quot;headerlink&quot; title=&quot;动机&quot;&gt;&lt;/a&gt;动机&lt;/h2&gt;&lt;p&gt;在Windows下lua是不具备直接调用Windows API的能力，因此如果想在lua中使用Windows API就需要先在C或C++中对Windows API进行一次封装，然后lua才能够去调用。由于Windows API数量巨多，对其进行逐个封装的工作量也是不小的。作为程序员对这种重复性的劳动总是比较厌烦的，因此就想写一个库支持从lua中直接调用，一劳永逸。&lt;/p&gt;</summary>
    
    
    
    <category term="Windows" scheme="https://blog.poxiao.me/category/windows/"/>
    
    
    <category term="Lua" scheme="https://blog.poxiao.me/tag/lua/"/>
    
    <category term="Windows" scheme="https://blog.poxiao.me/tag/windows/"/>
    
  </entry>
  
  <entry>
    <title>高级加密标准AES的工作模式（ECB、CBC、CFB、OFB）</title>
    <link href="https://blog.poxiao.me/p/advanced-encryption-standard-and-block-cipher-mode/"/>
    <id>https://blog.poxiao.me/p/advanced-encryption-standard-and-block-cipher-mode/</id>
    <published>2014-10-30T15:31:55.000Z</published>
    <updated>2024-04-29T14:21:39.481Z</updated>
    
    
    <summary type="html">&lt;p&gt;最近在重构之前写的HTTP代理，这个代理是由代理客户端和代理服务端组成的，二者之前使用SSL保证通信内容不会受到中间人(MITM)攻击。而新的实现打算移除SSL，因为SSL握手的开销过大，尤其是客户端与服务端之间隔了个太平洋，另一方面本月中旬的时候Google安全团队证明了SSLv3已经是不安全的了，需要升级到TLS，但TLS同样有握手的开销。在新的实现中客户端和服务端之间的通信将使用AES加密，每个连接使用独立的随机生成的密钥和初始化向量。客户端在向服务端发起连接后使用非对称加密算法RSA将密钥和初始化向量加密后发送给服务端，服务端在收到密钥和初始化向量后就全部使用AES加密通信，这保证了通信内容不会被窃听（但可能被篡改）。&lt;br&gt;本文作为备忘记录了学习分组加密模式的一些体会和理解。AES作为一种分组加密算法为了适应不同的安全性要求和传输需求允许在多种不同的加密模式下工作，本文只涉及到ECB、CBC、CFB和OFB四种加密模式，以OpenSSL开源库和C++语言作为描述。&lt;/p&gt;</summary>
    
    
    
    <category term="信息安全" scheme="https://blog.poxiao.me/category/information-security/"/>
    
    
    <category term="AES" scheme="https://blog.poxiao.me/tag/aes/"/>
    
    <category term="C++" scheme="https://blog.poxiao.me/tag/cpp/"/>
    
    <category term="OpenSSL" scheme="https://blog.poxiao.me/tag/openssl/"/>
    
  </entry>
  
  <entry>
    <title>C++11之多线程(三、条件变量）</title>
    <link href="https://blog.poxiao.me/p/multi-threading-in-cpp11-part-3-condition-variable/"/>
    <id>https://blog.poxiao.me/p/multi-threading-in-cpp11-part-3-condition-variable/</id>
    <published>2014-09-30T14:04:29.000Z</published>
    <updated>2024-04-29T14:21:39.484Z</updated>
    
    
    <summary type="html">&lt;h2 id=&quot;C-11之多线程系列文章目录&quot;&gt;&lt;a href=&quot;#C-11之多线程系列文章目录&quot; class=&quot;headerlink&quot; title=&quot;C++11之多线程系列文章目录&quot;&gt;&lt;/a&gt;C++11之多线程系列文章目录&lt;/h2&gt;&lt;p&gt;一、&lt;a href=&quot;/p/multi-threading-in-cpp11-part-1-thread-and-future/&quot;&gt;标准库的线程封装类Thread和Future&lt;/a&gt;&lt;br&gt;二、&lt;a href=&quot;/p/multi-threading-in-cpp11-part-2-mutex-and-lock/&quot;&gt;互斥对象(Mutex)和锁(Lock)&lt;/a&gt;&lt;br&gt;三、&lt;a href=&quot;/p/multi-threading-in-cpp11-part-3-condition-variable/&quot;&gt;条件变量(Condition Variable)&lt;/a&gt;&lt;br&gt;四、原子操作(Atomic Operation)&lt;br&gt;五、内存序(Memory Order)&lt;/p&gt;
&lt;h2 id=&quot;条件变量-Condition-Variable&quot;&gt;&lt;a href=&quot;#条件变量-Condition-Variable&quot; class=&quot;headerlink&quot; title=&quot;条件变量(Condition Variable)&quot;&gt;&lt;/a&gt;条件变量(Condition Variable)&lt;/h2&gt;&lt;p&gt;&lt;code&gt;条件变量&lt;/code&gt;是一种同步原语（Synchronization Primitive）用于多线程之间的通信，它可以阻塞一个或同时阻塞多个线程直到：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;收到来自其他线程的通知&lt;/li&gt;
&lt;li&gt;超时&lt;/li&gt;
&lt;li&gt;发生虚假唤醒(Spurious Wakeup)&lt;/li&gt;
&lt;/ul&gt;</summary>
    
    
    
    <category term="多线程" scheme="https://blog.poxiao.me/category/multi-threading/"/>
    
    
    <category term="C++" scheme="https://blog.poxiao.me/tag/cpp/"/>
    
    <category term="多线程" scheme="https://blog.poxiao.me/tag/multi-threading/"/>
    
    <category term="C++11" scheme="https://blog.poxiao.me/tag/cpp11/"/>
    
    <category term="条件变量" scheme="https://blog.poxiao.me/tag/condition-variable/"/>
    
  </entry>
  
  <entry>
    <title>获取优酷视频的真实地址</title>
    <link href="https://blog.poxiao.me/p/fetch-youku-video-url/"/>
    <id>https://blog.poxiao.me/p/fetch-youku-video-url/</id>
    <published>2014-08-31T13:30:20.000Z</published>
    <updated>2024-04-29T14:21:39.482Z</updated>
    
    
    <summary type="html">&lt;p&gt;使用网页看视频是非常不爽的，尤其是长视频，因为使用网页看视频就意味着你无法在不开多个浏览器窗口的条件下边看视频边浏览网页，而且最最重要的是有广告啊。如果获取到视频的地址就可以直接使用播放器播放了。&lt;/p&gt;
&lt;h2 id=&quot;获取优酷的视频链接&quot;&gt;&lt;a href=&quot;#获取优酷的视频链接&quot; class=&quot;headerlink&quot; title=&quot;获取优酷的视频链接&quot;&gt;&lt;/a&gt;获取优酷的视频链接&lt;/h2&gt;&lt;p&gt;对于优酷播放页面为&lt;/p&gt;
&lt;figure class=&quot;highlight text&quot;&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&quot;gutter&quot;&gt;&lt;pre&gt;&lt;span class=&quot;line&quot;&gt;1&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;td class=&quot;code&quot;&gt;&lt;pre&gt;&lt;span class=&quot;line&quot;&gt;http://v.youku.com/v_show/id_XNzYwODQ3MTg0.html&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;

&lt;p&gt;的视频对应的mp4的真实地址为(这个视频被优酷切分成四段)&lt;/p&gt;
&lt;figure class=&quot;highlight text&quot;&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&quot;gutter&quot;&gt;&lt;pre&gt;&lt;span class=&quot;line&quot;&gt;1&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;2&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;3&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;4&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;td class=&quot;code&quot;&gt;&lt;pre&gt;&lt;span class=&quot;line&quot;&gt;http://k.youku.com/player/getFlvPath/sid/3409483123616127f4226_00/st/mp4/fileid/030008040053F98A94E2631468DEFED15CC475-F07D-7762-1FA8-EB95B046B8B8?K=414595e722b677a42411ec29&amp;amp;hd=1&amp;amp;myp=0&amp;amp;ts=377&amp;amp;ypp=0&amp;amp;ctype=12&amp;amp;ev=1&amp;amp;token=7168&amp;amp;oip=2130706433&amp;amp;ep=cSaUE02FVc8C5iXejj8bYHrmdnUJXP4J9h%2bFidJmALshS562kU%2fYw%2biySPxDEv8RBldwZZ%2fwrqOUbkcRYYZDrhwQ2EmuO%2frhiIHr5dghzZVyZh0wAMWlvFSZQjb5&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;http://k.youku.com/player/getFlvPath/sid/3409483123616127f4226_00/st/mp4/fileid/030008040153F98A94E2631468DEFED15CC475-F07D-7762-1FA8-EB95B046B8B8?K=d4371bb9a461be672829d1b5&amp;amp;hd=1&amp;amp;myp=0&amp;amp;ts=401&amp;amp;ypp=0&amp;amp;ctype=12&amp;amp;ev=1&amp;amp;token=7168&amp;amp;oip=2130706433&amp;amp;ep=cSaUE02FVc8C5iXejj8bYHrmdnUJXP4J9h%2bFidJmALohS562kU%2fYw%2biySPxDEv8RBldwZZ%2fwrqOUbkcRYYZDrhwQ2EmuO%2frhiIHr5dghzZVyZh0wAMWlvFSZQjb5&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;http://k.youku.com/player/getFlvPath/sid/3409483123616127f4226_00/st/mp4/fileid/030008040253F98A94E2631468DEFED15CC475-F07D-7762-1FA8-EB95B046B8B8?K=f0197761ab939438261ddeef&amp;amp;hd=1&amp;amp;myp=0&amp;amp;ts=333&amp;amp;ypp=0&amp;amp;ctype=12&amp;amp;ev=1&amp;amp;token=7168&amp;amp;oip=2130706433&amp;amp;ep=cSaUE02FVc8C5iXejj8bYHrmdnUJXP4J9h%2bFidJmALkhS562kU%2fYw%2biySPxDEv8RBldwZZ%2fwrqOUbkcRYYZDrhwQ2EmuO%2frhiIHr5dghzZVyZh0wAMWlvFSZQjb5&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;http://k.youku.com/player/getFlvPath/sid/3409483123616127f4226_00/st/mp4/fileid/030008040353F98A94E2631468DEFED15CC475-F07D-7762-1FA8-EB95B046B8B8?K=9ee3d46ac50a40262411ec29&amp;amp;hd=1&amp;amp;myp=0&amp;amp;ts=311&amp;amp;ypp=0&amp;amp;ctype=12&amp;amp;ev=1&amp;amp;token=7168&amp;amp;oip=2130706433&amp;amp;ep=cSaUE02FVc8C5iXejj8bYHrmdnUJXP4J9h%2bFidJmALghS562kU%2fYw%2biySPxDEv8RBldwZZ%2fwrqOUbkcRYYZDrhwQ2EmuO%2frhiIHr5dghzZVyZh0wAMWlvFSZQjb5&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;</summary>
    
    
    
    <category term="C++" scheme="https://blog.poxiao.me/category/cpp/"/>
    
    
    <category term="C++" scheme="https://blog.poxiao.me/tag/cpp/"/>
    
    <category term="优酷" scheme="https://blog.poxiao.me/tag/youku/"/>
    
  </entry>
  
  <entry>
    <title>C++11之多线程(二、互斥对象和锁）</title>
    <link href="https://blog.poxiao.me/p/multi-threading-in-cpp11-part-2-mutex-and-lock/"/>
    <id>https://blog.poxiao.me/p/multi-threading-in-cpp11-part-2-mutex-and-lock/</id>
    <published>2014-07-16T15:31:04.000Z</published>
    <updated>2024-04-29T14:21:39.483Z</updated>
    
    
    <summary type="html">&lt;h2 id=&quot;C-11之多线程系列文章目录&quot;&gt;&lt;a href=&quot;#C-11之多线程系列文章目录&quot; class=&quot;headerlink&quot; title=&quot;C++11之多线程系列文章目录&quot;&gt;&lt;/a&gt;C++11之多线程系列文章目录&lt;/h2&gt;&lt;p&gt;一、&lt;a href=&quot;/p/multi-threading-in-cpp11-part-1-thread-and-future/&quot;&gt;标准库的线程封装类Thread和Future&lt;/a&gt;&lt;br&gt;二、&lt;a href=&quot;/p/multi-threading-in-cpp11-part-2-mutex-and-lock/&quot;&gt;互斥对象(Mutex)和锁(Lock)&lt;/a&gt;&lt;br&gt;三、&lt;a href=&quot;/p/multi-threading-in-cpp11-part-3-condition-variable/&quot;&gt;条件变量(Condition Variable)&lt;/a&gt;&lt;br&gt;四、原子操作(Atomic Operation)&lt;br&gt;五、内存序(Memory Order)&lt;/p&gt;
&lt;h2 id=&quot;互斥-Mutex-Mutual-Exclusion&quot;&gt;&lt;a href=&quot;#互斥-Mutex-Mutual-Exclusion&quot; class=&quot;headerlink&quot; title=&quot;互斥(Mutex: Mutual Exclusion)&quot;&gt;&lt;/a&gt;互斥(Mutex: Mutual Exclusion)&lt;/h2&gt;&lt;p&gt;下面的代码中两个线程连续的往int_set中插入多个随机产生的整数。&lt;/p&gt;
&lt;figure class=&quot;highlight c++&quot;&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&quot;gutter&quot;&gt;&lt;pre&gt;&lt;span class=&quot;line&quot;&gt;1&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;2&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;3&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;4&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;5&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;6&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;7&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;8&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;9&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;10&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;11&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;12&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;13&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;14&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;td class=&quot;code&quot;&gt;&lt;pre&gt;&lt;span class=&quot;line&quot;&gt;std::set&amp;lt;&lt;span class=&quot;type&quot;&gt;int&lt;/span&gt;&amp;gt; int_set;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;keyword&quot;&gt;auto&lt;/span&gt; f = [&amp;amp;int_set]() &amp;#123;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;    &lt;span class=&quot;keyword&quot;&gt;try&lt;/span&gt; &amp;#123;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;        std::random_device rd;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;        &lt;span class=&quot;function&quot;&gt;std::mt19937 &lt;span class=&quot;title&quot;&gt;gen&lt;/span&gt;&lt;span class=&quot;params&quot;&gt;(rd())&lt;/span&gt;&lt;/span&gt;;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;        std::uniform_int_distribution&amp;lt;&amp;gt; &lt;span class=&quot;built_in&quot;&gt;dis&lt;/span&gt;(&lt;span class=&quot;number&quot;&gt;1&lt;/span&gt;, &lt;span class=&quot;number&quot;&gt;1000&lt;/span&gt;);&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;        &lt;span class=&quot;keyword&quot;&gt;for&lt;/span&gt;(std::&lt;span class=&quot;type&quot;&gt;size_t&lt;/span&gt; i = &lt;span class=&quot;number&quot;&gt;0&lt;/span&gt;; i != &lt;span class=&quot;number&quot;&gt;100000&lt;/span&gt;; ++i) &amp;#123;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;            int_set.&lt;span class=&quot;built_in&quot;&gt;insert&lt;/span&gt;(&lt;span class=&quot;built_in&quot;&gt;dis&lt;/span&gt;(gen));&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;        &amp;#125;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;    &amp;#125; &lt;span class=&quot;built_in&quot;&gt;catch&lt;/span&gt;(...) &amp;#123;&amp;#125;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;&amp;#125;;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;function&quot;&gt;std::thread &lt;span class=&quot;title&quot;&gt;td1&lt;/span&gt;&lt;span class=&quot;params&quot;&gt;(f)&lt;/span&gt;, &lt;span class=&quot;title&quot;&gt;td2&lt;/span&gt;&lt;span class=&quot;params&quot;&gt;(f)&lt;/span&gt;&lt;/span&gt;;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;td1.&lt;span class=&quot;built_in&quot;&gt;join&lt;/span&gt;();&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;td2.&lt;span class=&quot;built_in&quot;&gt;join&lt;/span&gt;();&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;</summary>
    
    
    
    <category term="多线程" scheme="https://blog.poxiao.me/category/multi-threading/"/>
    
    
    <category term="多线程" scheme="https://blog.poxiao.me/tag/multi-threading/"/>
    
    <category term="C++11" scheme="https://blog.poxiao.me/tag/cpp11/"/>
    
  </entry>
  
  <entry>
    <title>Ubuntu中编译GCC4.9.0</title>
    <link href="https://blog.poxiao.me/p/build-gcc4-9-0-in-ubuntu/"/>
    <id>https://blog.poxiao.me/p/build-gcc4-9-0-in-ubuntu/</id>
    <published>2014-06-02T12:28:01.000Z</published>
    <updated>2024-04-29T14:21:39.482Z</updated>
    
    
    <summary type="html">&lt;h2 id=&quot;编译环境&quot;&gt;&lt;a href=&quot;#编译环境&quot; class=&quot;headerlink&quot; title=&quot;编译环境&quot;&gt;&lt;/a&gt;编译环境&lt;/h2&gt;&lt;p&gt;此次编译使用的是&lt;code&gt;Windows Azure&lt;/code&gt;的虚拟机，基本的配置信息是这样的。&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;项目&lt;/th&gt;
&lt;th&gt;信息&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;操作系统&lt;/td&gt;
&lt;td&gt;Ubuntu 14.04 LTS (GNU&amp;#x2F;Linux 3.13.0-27-generic x86_64)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;处理器频率(MHz)&lt;/td&gt;
&lt;td&gt;2094.651&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;处理器核心数&lt;/td&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;内存(GB)&lt;/td&gt;
&lt;td&gt;3.5&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h2 id=&quot;准备工作&quot;&gt;&lt;a href=&quot;#准备工作&quot; class=&quot;headerlink&quot; title=&quot;准备工作&quot;&gt;&lt;/a&gt;准备工作&lt;/h2&gt;&lt;p&gt;1.一个支持ISO C++98的C++编译器&lt;/p&gt;</summary>
    
    
    
    <category term="Linux" scheme="https://blog.poxiao.me/category/linux/"/>
    
    
    <category term="GCC" scheme="https://blog.poxiao.me/tag/gcc/"/>
    
    <category term="Linux" scheme="https://blog.poxiao.me/tag/linux/"/>
    
    <category term="Ubuntu" scheme="https://blog.poxiao.me/tag/ubuntu/"/>
    
  </entry>
  
  <entry>
    <title>C++14使用std::integer_sequence展开tuple作为函数的参数</title>
    <link href="https://blog.poxiao.me/p/unpacking-a-tuple-to-call-a-function-in-cpp14/"/>
    <id>https://blog.poxiao.me/p/unpacking-a-tuple-to-call-a-function-in-cpp14/</id>
    <published>2014-04-27T15:33:52.000Z</published>
    <updated>2024-04-29T14:21:39.486Z</updated>
    
    
    <summary type="html">&lt;blockquote&gt;
&lt;p&gt;我原先并不知道std::integer_sequence有什么用，直到我的膝盖中了一箭。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&quot;元组-Tuple&quot;&gt;&lt;a href=&quot;#元组-Tuple&quot; class=&quot;headerlink&quot; title=&quot;元组(Tuple)&quot;&gt;&lt;/a&gt;元组(Tuple)&lt;/h2&gt;&lt;p&gt;元组是一种长度固定的允许有不同类型元素的集合，根据元素的个数不同又分别称作一元组、二元组、三元组等。C++11中标准库增加了一个叫std::tuple的类模板，用于表示元组。下面的代码演示了使用C++创建一个三元组。&lt;/p&gt;
&lt;figure class=&quot;highlight c++&quot;&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&quot;gutter&quot;&gt;&lt;pre&gt;&lt;span class=&quot;line&quot;&gt;1&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;2&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;3&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;4&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;5&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;6&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;7&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;8&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;td class=&quot;code&quot;&gt;&lt;pre&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;keyword&quot;&gt;auto&lt;/span&gt; tuple = std::&lt;span class=&quot;built_in&quot;&gt;make_tuple&lt;/span&gt;(&lt;span class=&quot;number&quot;&gt;1&lt;/span&gt;, &lt;span class=&quot;string&quot;&gt;&amp;#x27;A&amp;#x27;&lt;/span&gt;, &lt;span class=&quot;string&quot;&gt;&amp;quot;破晓的博客&amp;quot;&lt;/span&gt;);&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;std::cout &amp;lt;&amp;lt; std::&lt;span class=&quot;built_in&quot;&gt;get&lt;/span&gt;&amp;lt;&lt;span class=&quot;number&quot;&gt;0&lt;/span&gt;&amp;gt;(tuple) &amp;lt;&amp;lt; std::endl;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;std::cout &amp;lt;&amp;lt; std::&lt;span class=&quot;built_in&quot;&gt;get&lt;/span&gt;&amp;lt;&lt;span class=&quot;number&quot;&gt;1&lt;/span&gt;&amp;gt;(tuple) &amp;lt;&amp;lt; std::endl;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;std::cout &amp;lt;&amp;lt; std::&lt;span class=&quot;built_in&quot;&gt;get&lt;/span&gt;&amp;lt;&lt;span class=&quot;number&quot;&gt;2&lt;/span&gt;&amp;gt;(tuple) &amp;lt;&amp;lt; std::endl;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;comment&quot;&gt;// 下面是C++14的特性&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;std::cout &amp;lt;&amp;lt; std::&lt;span class=&quot;built_in&quot;&gt;get&lt;/span&gt;&amp;lt;&lt;span class=&quot;type&quot;&gt;int&lt;/span&gt;&amp;gt;(tuple) &amp;lt;&amp;lt; std::endl;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;std::cout &amp;lt;&amp;lt; std::&lt;span class=&quot;built_in&quot;&gt;get&lt;/span&gt;&amp;lt;&lt;span class=&quot;type&quot;&gt;char&lt;/span&gt;&amp;gt;(tuple) &amp;lt;&amp;lt; std::endl;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;std::cout &amp;lt;&amp;lt; std::&lt;span class=&quot;built_in&quot;&gt;get&lt;/span&gt;&amp;lt;&lt;span class=&quot;type&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;type&quot;&gt;char&lt;/span&gt;*&amp;gt;(tuple) &amp;lt;&amp;lt; std::endl;&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;

&lt;p&gt;输出&lt;/p&gt;
&lt;figure class=&quot;highlight plaintext&quot;&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&quot;gutter&quot;&gt;&lt;pre&gt;&lt;span class=&quot;line&quot;&gt;1&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;2&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;3&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;4&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;5&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;6&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;td class=&quot;code&quot;&gt;&lt;pre&gt;&lt;span class=&quot;line&quot;&gt;1&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;A&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;破晓的博客&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;1&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;A&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;破晓的博客&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;

&lt;p&gt;许多编程语言如C#、Python等也有tuple的概念。下面的代码演示了使用Python创建一个三元组。&lt;/p&gt;
&lt;figure class=&quot;highlight python&quot;&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&quot;gutter&quot;&gt;&lt;pre&gt;&lt;span class=&quot;line&quot;&gt;1&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;2&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;3&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;4&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;td class=&quot;code&quot;&gt;&lt;pre&gt;&lt;span class=&quot;line&quot;&gt;t = (&lt;span class=&quot;number&quot;&gt;1&lt;/span&gt;, &lt;span class=&quot;string&quot;&gt;&amp;#x27;A&amp;#x27;&lt;/span&gt;, &lt;span class=&quot;string&quot;&gt;&amp;quot;破晓的博客&amp;quot;&lt;/span&gt;)&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;built_in&quot;&gt;print&lt;/span&gt;(t[&lt;span class=&quot;number&quot;&gt;0&lt;/span&gt;])&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;built_in&quot;&gt;print&lt;/span&gt;(t[&lt;span class=&quot;number&quot;&gt;1&lt;/span&gt;])&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;built_in&quot;&gt;print&lt;/span&gt;(t[&lt;span class=&quot;number&quot;&gt;2&lt;/span&gt;])&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;

&lt;p&gt;输出&lt;/p&gt;
&lt;figure class=&quot;highlight plaintext&quot;&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&quot;gutter&quot;&gt;&lt;pre&gt;&lt;span class=&quot;line&quot;&gt;1&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;2&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;3&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;td class=&quot;code&quot;&gt;&lt;pre&gt;&lt;span class=&quot;line&quot;&gt;1&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;A&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;破晓的博客&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;

&lt;p&gt;Python从语言级别上支持将tuple展开为函数的参数，在Python中假设定义有这样一个函数func和一个元组t，下面的代码演示了将元组t的每个元素作为func函数的参数。&lt;/p&gt;
&lt;figure class=&quot;highlight python&quot;&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&quot;gutter&quot;&gt;&lt;pre&gt;&lt;span class=&quot;line&quot;&gt;1&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;2&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;3&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;4&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;td class=&quot;code&quot;&gt;&lt;pre&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;keyword&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;title function_&quot;&gt;func&lt;/span&gt;(&lt;span class=&quot;params&quot;&gt;arg1, arg2, arg3&lt;/span&gt;):&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;    &lt;span class=&quot;built_in&quot;&gt;print&lt;/span&gt;(arg1, arg2, arg3)&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;t = (&lt;span class=&quot;number&quot;&gt;1&lt;/span&gt;, &lt;span class=&quot;string&quot;&gt;&amp;#x27;A&amp;#x27;&lt;/span&gt;, &lt;span class=&quot;string&quot;&gt;&amp;quot;破晓的博客&amp;quot;&lt;/span&gt;)&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;func(*t)&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;</summary>
    
    
    
    <category term="C++" scheme="https://blog.poxiao.me/category/cpp/"/>
    
    
    <category term="C++" scheme="https://blog.poxiao.me/tag/cpp/"/>
    
    <category term="C++11" scheme="https://blog.poxiao.me/tag/cpp11/"/>
    
    <category term="C++14" scheme="https://blog.poxiao.me/tag/cpp14/"/>
    
    <category term="integer_sequence" scheme="https://blog.poxiao.me/tag/integer-sequence/"/>
    
    <category term="Python" scheme="https://blog.poxiao.me/tag/python/"/>
    
    <category term="Template" scheme="https://blog.poxiao.me/tag/template/"/>
    
    <category term="Tuple" scheme="https://blog.poxiao.me/tag/tuple/"/>
    
  </entry>
  
  <entry>
    <title>C++11实现自旋锁</title>
    <link href="https://blog.poxiao.me/p/spinlock-implementation-in-cpp11/"/>
    <id>https://blog.poxiao.me/p/spinlock-implementation-in-cpp11/</id>
    <published>2014-04-20T11:13:27.000Z</published>
    <updated>2024-04-29T14:21:39.485Z</updated>
    
    
    <summary type="html">&lt;h2 id=&quot;自旋锁-Spinlock&quot;&gt;&lt;a href=&quot;#自旋锁-Spinlock&quot; class=&quot;headerlink&quot; title=&quot;自旋锁(Spinlock)&quot;&gt;&lt;/a&gt;自旋锁(Spinlock)&lt;/h2&gt;&lt;p&gt;自旋锁是一种用于保护多线程共享资源的锁，与一般的互斥锁(mutex)不同之处在于当自旋锁尝试获取锁的所有权时会以忙等待(busy waiting)的形式不断的循环检查锁是否可用。在多处理器环境中对持有锁时间较短的程序来说使用自旋锁代替一般的互斥锁往往能提高程序的性能。&lt;/p&gt;
&lt;h2 id=&quot;自旋锁的原理&quot;&gt;&lt;a href=&quot;#自旋锁的原理&quot; class=&quot;headerlink&quot; title=&quot;自旋锁的原理&quot;&gt;&lt;/a&gt;自旋锁的原理&lt;/h2&gt;&lt;p&gt;自旋锁有两种基本状态：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;锁定状态&lt;br&gt;锁定状态又称不可用状态，当自旋锁被某个线程持有时就是锁定状态，在自旋锁被释放之前其他线程不能获得锁的所有权。&lt;/li&gt;
&lt;li&gt;可用状态&lt;br&gt;当自选锁未被任何线程持有时的状态就是可用状态。</summary>
    
    
    
    <category term="Concurrency" scheme="https://blog.poxiao.me/category/concurrency/"/>
    
    
    <category term="C++" scheme="https://blog.poxiao.me/tag/cpp/"/>
    
    <category term="Concurrency" scheme="https://blog.poxiao.me/tag/concurrency/"/>
    
    <category term="多线程" scheme="https://blog.poxiao.me/tag/multi-threading/"/>
    
    <category term="C++11" scheme="https://blog.poxiao.me/tag/cpp11/"/>
    
    <category term="Atomic" scheme="https://blog.poxiao.me/tag/atomic/"/>
    
    <category term="Memory Order" scheme="https://blog.poxiao.me/tag/memory-order/"/>
    
  </entry>
  
  <entry>
    <title>C++11之多线程(一、标准库的线程封装类Thread和Future）</title>
    <link href="https://blog.poxiao.me/p/multi-threading-in-cpp11-part-1-thread-and-future/"/>
    <id>https://blog.poxiao.me/p/multi-threading-in-cpp11-part-1-thread-and-future/</id>
    <published>2014-03-30T12:16:00.000Z</published>
    <updated>2015-05-21T15:16:23.000Z</updated>
    
    
    <summary type="html">&lt;h2 id=&quot;前言&quot;&gt;&lt;a href=&quot;#前言&quot; class=&quot;headerlink&quot; title=&quot;前言&quot;&gt;&lt;/a&gt;前言&lt;/h2&gt;&lt;p&gt;学习C++11的多线程已经有一段时间了，所以打算整理记录下来，分成五篇文章：&lt;br&gt;一、&lt;a href=&quot;/p/multi-threading-in-cpp11-part-1-thread-and-future/&quot;&gt;标准库的线程封装类Thread和Future&lt;/a&gt;&lt;br&gt;二、&lt;a href=&quot;/p/multi-threading-in-cpp11-part-2-mutex-and-lock/&quot;&gt;互斥对象(Mutex)和锁(Lock)&lt;/a&gt;&lt;br&gt;三、&lt;a href=&quot;/p/multi-threading-in-cpp11-part-3-condition-variable/&quot;&gt;条件变量(Condition Variable)&lt;/a&gt;&lt;br&gt;四、原子操作(Atomic Operation)&lt;br&gt;五、内存序(Memory Order)&lt;/p&gt;
&lt;h2 id=&quot;多线程概述&quot;&gt;&lt;a href=&quot;#多线程概述&quot; class=&quot;headerlink&quot; title=&quot;多线程概述&quot;&gt;&lt;/a&gt;多线程概述&lt;/h2&gt;&lt;p&gt;线程(Thread)是程序中独立执行的指令流，通常是系统调度的基本单位。含有两个或两个以上线程的程序就称为多线程程序，在硬件允许的情况下多个线程可以彼此独立的并行执行。在许多情况下都需要使用多线程，比如：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;程序需要进行一些IO操作，IO操作通常需要一些时间才能完成，在这段时间线程就会被阻塞(Block)。使用多线程就可以启动一个新的线程去等待IO操作完成，而当前线程就可不被阻塞的继续执行别的工作；&lt;/li&gt;
&lt;li&gt;在多核心处理器的机器上执行计算密集型的程序。使用多线程就可以将计算工作切分成多个独立的计算工作交给多个线程在CPU的不同核心上并行计算。&lt;br&gt;C++11开始提供了对多线程的支持。标准库提供了std::thread类来创建和管理线程，std::future类模板来获取异步操作的结果。</summary>
    
    
    
    <category term="多线程" scheme="https://blog.poxiao.me/category/multi-threading/"/>
    
    
    <category term="C++" scheme="https://blog.poxiao.me/tag/cpp/"/>
    
    <category term="多线程" scheme="https://blog.poxiao.me/tag/multi-threading/"/>
    
    <category term="C++11" scheme="https://blog.poxiao.me/tag/cpp11/"/>
    
  </entry>
  
  <entry>
    <title>C++11与Unicode及使用标准库进行UTF-8、UTF-16、UCS2、UCS4/UTF-32编码转换</title>
    <link href="https://blog.poxiao.me/p/unicode-character-encoding-conversion-in-cpp11/"/>
    <id>https://blog.poxiao.me/p/unicode-character-encoding-conversion-in-cpp11/</id>
    <published>2014-02-28T13:16:00.000Z</published>
    <updated>2015-05-21T14:00:22.000Z</updated>
    
    
    <summary type="html">&lt;h2 id=&quot;Unicode&quot;&gt;&lt;a href=&quot;#Unicode&quot; class=&quot;headerlink&quot; title=&quot;Unicode&quot;&gt;&lt;/a&gt;Unicode&lt;/h2&gt;&lt;p&gt;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日。&lt;/p&gt;
&lt;h2 id=&quot;Unicode的编码方式&quot;&gt;&lt;a href=&quot;#Unicode的编码方式&quot; class=&quot;headerlink&quot; title=&quot;Unicode的编码方式&quot;&gt;&lt;/a&gt;Unicode的编码方式&lt;/h2&gt;&lt;p&gt;对于被Unicode收录的字符其编码是唯一且确定的。但是Unicode的实现方式(出于传输、存储、处理或向后兼容的考虑)却有不同的几种，其中最流行的是UTF-8、UTF-16、UCS2、UCS4&amp;#x2F;UTF-32等，细分的话还有大小端的区别。&lt;/p&gt;</summary>
    
    
    
    <category term="C++" scheme="https://blog.poxiao.me/category/cpp/"/>
    
    
    <category term="C++11" scheme="https://blog.poxiao.me/tag/cpp11/"/>
    
    <category term="codecvt" scheme="https://blog.poxiao.me/tag/codecvt/"/>
    
    <category term="ucs2" scheme="https://blog.poxiao.me/tag/ucs2/"/>
    
    <category term="ucs4" scheme="https://blog.poxiao.me/tag/ucs4/"/>
    
    <category term="unicode" scheme="https://blog.poxiao.me/tag/unicode/"/>
    
    <category term="utf-16" scheme="https://blog.poxiao.me/tag/utf-16/"/>
    
    <category term="utf-8" scheme="https://blog.poxiao.me/tag/utf-8/"/>
    
  </entry>
  
  <entry>
    <title>快播HTTP链接转QVOD链接</title>
    <link href="https://blog.poxiao.me/p/kuaibo-http-to-qvod/"/>
    <id>https://blog.poxiao.me/p/kuaibo-http-to-qvod/</id>
    <published>2013-12-22T09:28:18.000Z</published>
    <updated>2015-05-21T13:41:35.000Z</updated>
    
    
    <summary type="html">&lt;blockquote&gt;
&lt;p&gt;抱歉，不再提供在线转换服务。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;示例链接:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;http&lt;!-- --&gt;:&amp;#x2F;&amp;#x2F;x.poxiao.me:1234&amp;#x2F;189224990&amp;#x2F;3BA3B4EA759CA9043F887B1B29985677DB38AD03&amp;#x2F;东京暗鸦_2013_HDTV_01.mp4&lt;/li&gt;
&lt;li&gt;http&lt;!-- --&gt;:&amp;#x2F;&amp;#x2F;x.poxiao.me:1234&amp;#x2F;115932953&amp;#x2F;8D0238A835768073BE0DC3BB946E8AD24F89C92A&amp;#x2F;东京暗鸦_2013_HDTV_02.mp4&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;使用说明:&lt;/strong&gt;&lt;br&gt;并不是任何http链接都可以转换成qvod链接，只有形如http&lt;!-- --&gt;:&amp;#x2F;&amp;#x2F;host[:port]&amp;#x2F;file_size&amp;#x2F;http_hash&amp;#x2F;file_name的链接才能转换。将快播的http链接输入上方的文本区域，每行一条链接，支持批量转换，点击下方的转换按钮即可完成转换。&lt;/p&gt;</summary>
    
    
    
    <category term="Tools" scheme="https://blog.poxiao.me/category/tools/"/>
    
    
    <category term="qvod" scheme="https://blog.poxiao.me/tag/qvod/"/>
    
  </entry>
  
  <entry>
    <title>快播(QVOD)、百度影音(BDHD)链接转ED2K链接</title>
    <link href="https://blog.poxiao.me/p/qvod-bdhd-to-ed2k/"/>
    <id>https://blog.poxiao.me/p/qvod-bdhd-to-ed2k/</id>
    <published>2013-12-08T09:26:37.000Z</published>
    <updated>2015-05-21T13:28:06.000Z</updated>
    
    
      
      
        
        
    <summary type="html">&lt;blockquote&gt;
&lt;p&gt;抱歉，不再提供在线转换服务。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;示例链接:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;bdhd:&amp;#x2F;&amp;#x2F;2559345489|F34F589105A0013F7183DAF4</summary>
        
      
    
    
    
    <category term="Tools" scheme="https://blog.poxiao.me/category/tools/"/>
    
    
    <category term="qvod" scheme="https://blog.poxiao.me/tag/qvod/"/>
    
    <category term="bdhd" scheme="https://blog.poxiao.me/tag/bdhd/"/>
    
    <category term="ed2k" scheme="https://blog.poxiao.me/tag/ed2k/"/>
    
  </entry>
  
  <entry>
    <title>微软发布Visual C++ Nov 2013 CTP支持更多的C++11、C++14特性</title>
    <link href="https://blog.poxiao.me/p/visual-cpp-nov-2013-ctp-adds-more-cxx11-14-features/"/>
    <id>https://blog.poxiao.me/p/visual-cpp-nov-2013-ctp-adds-more-cxx11-14-features/</id>
    <published>2013-11-23T06:25:09.000Z</published>
    <updated>2014-01-01T10:15:08.000Z</updated>
    
    
    <summary type="html">&lt;h2 id=&quot;Visual-C-Nov-2013-CTP&quot;&gt;&lt;a href=&quot;#Visual-C-Nov-2013-CTP&quot; class=&quot;headerlink&quot; title=&quot;Visual C++ Nov 2013 CTP&quot;&gt;&lt;/a&gt;Visual C++ Nov 2013 CTP&lt;/h2&gt;&lt;p&gt;微软在这周发布了Visual C++ Nov 2013 CTP，包含了下面这些C++11、C++14和C++&amp;#x2F;CX新特性：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Implicit move special member function generation (thus also completing &amp;#x3D;default)&lt;/li&gt;
&lt;li&gt;Reference qualifiers on member functions (a.k.a. “&amp;amp; and &amp;amp;&amp;amp; for *this”)&lt;/li&gt;
&lt;li&gt;Thread-safe function local static initialization (a.k.a. “magic statics”)&lt;/li&gt;
&lt;li&gt;Inheriting constructors&lt;/li&gt;
&lt;li&gt;alignof&amp;#x2F;alignas&lt;/li&gt;
&lt;li&gt;__func__&lt;/li&gt;
&lt;li&gt;Extended sizeof&lt;/li&gt;
&lt;li&gt;constexpr (except for member functions)&lt;/li&gt;
&lt;li&gt;noexcept (unconditional)&lt;/li&gt;
&lt;li&gt;C++14 decltype(auto)&lt;/li&gt;
&lt;li&gt;C++14 auto function return type deduction&lt;/li&gt;
&lt;li&gt;C++14 generic lambdas (with explicit lambda capture list)&lt;/li&gt;
&lt;li&gt;(Proposed for C++17) Resumable functions and await&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;Implicit-move-special-member-function-generation&quot;&gt;&lt;a href=&quot;#Implicit-move-special-member-function-generation&quot; class=&quot;headerlink&quot; title=&quot;Implicit move special member function generation&quot;&gt;&lt;/a&gt;Implicit move special member function generation&lt;/h3&gt;&lt;p&gt;在C++03中default关键字用于在switch语句中声明default case。在C++11中增加了让编译器为类生成默认构造函数、移动构造函数、赋值操作符、移动操作符和析构函数的功能。&lt;br&gt;比如在C++11中可以这样声明一个wrapper类</summary>
    
    
    
    <category term="C++" scheme="https://blog.poxiao.me/category/cpp/"/>
    
    
    <category term="C++" scheme="https://blog.poxiao.me/tag/cpp/"/>
    
    <category term="C++11" scheme="https://blog.poxiao.me/tag/cpp11/"/>
    
    <category term="C++14" scheme="https://blog.poxiao.me/tag/cpp14/"/>
    
    <category term="VS" scheme="https://blog.poxiao.me/tag/vs/"/>
    
  </entry>
  
  <entry>
    <title>C++使用正则表达式解析.srt字幕文件</title>
    <link href="https://blog.poxiao.me/p/parse-srt-file-via-regex-in-cpp/"/>
    <id>https://blog.poxiao.me/p/parse-srt-file-via-regex-in-cpp/</id>
    <published>2013-10-27T11:02:01.000Z</published>
    <updated>2014-10-27T12:09:22.000Z</updated>
    
    
    <summary type="html">&lt;h3 id=&quot;SRT文件&quot;&gt;&lt;a href=&quot;#SRT文件&quot; class=&quot;headerlink&quot; title=&quot;SRT文件&quot;&gt;&lt;/a&gt;SRT文件&lt;/h3&gt;&lt;p&gt;.srt是一种非常流行的基于文本行格式的字幕文件。一个简单的字幕文件的内容如下(&lt;em&gt;本文不考虑字幕有多行的情况&lt;/em&gt;)：&lt;/p&gt;
&lt;figure class=&quot;highlight plaintext&quot;&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&quot;gutter&quot;&gt;&lt;pre&gt;&lt;span class=&quot;line&quot;&gt;1&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;2&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;3&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;4&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;5&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;6&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;7&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;8&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;9&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;10&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;11&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;12&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;13&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;14&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;15&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;16&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;17&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;18&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;19&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;20&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;td class=&quot;code&quot;&gt;&lt;pre&gt;&lt;span class=&quot;line&quot;&gt;1&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;00:00:53,477 --&amp;gt; 00:00:54,845&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;大唐&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;2&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;00:00:55,212 --&amp;gt; 00:00:57,280&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;我夙夜忧思的母国&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;3&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;00:00:58,615 --&amp;gt; 00:00:59,750&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;洛阳&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;4&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;00:01:00,250 --&amp;gt; 00:01:02,419&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;我魂萦梦系之地&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;5&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;00:01:05,389 --&amp;gt; 00:01:06,890&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;三十岁那年&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;
&lt;p&gt;其内容包括序号，开始时间和结束时间，以及字幕的文本内容，以&#92;r&#92;n相互隔开，最后以&#92;r&#92;n&#92;r&#92;n结束，这样的格式很容易通过正则表达式匹配来解析。&lt;/p&gt;</summary>
    
    
    
    <category term="C++" scheme="https://blog.poxiao.me/category/cpp/"/>
    
    
    <category term="C++" scheme="https://blog.poxiao.me/tag/cpp/"/>
    
    <category term="C#" scheme="https://blog.poxiao.me/tag/csharp/"/>
    
    <category term="正则表达式" scheme="https://blog.poxiao.me/tag/regex/"/>
    
  </entry>
  
  <entry>
    <title>【吐槽】迅雷VIP尊享版2.0.5.110整合迅雷云播</title>
    <link href="https://blog.poxiao.me/p/thundervip-client-2-0-5-110-cloudplay/"/>
    <id>https://blog.poxiao.me/p/thundervip-client-2-0-5-110-cloudplay/</id>
    <published>2013-10-12T15:04:24.000Z</published>
    <updated>2014-05-24T14:45:54.000Z</updated>
    
    
    <summary type="html">&lt;p&gt;今天把客户端更新到了2.0.5.110，插队下载在这个版本得到了回归，而整合的迅雷云播则着实让我无力吐槽。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;整合的云播和Web版的云播基本功能相同，左侧的云播记录相当于Web版的全部任务，收藏相当于Web版的隐藏任务。增加了一个Web版所没有的我的好友。在这个页面可以使用雷达搜索附近的人(说是附近但其实能精确到和你同一个县级市或区就不错了，毕竟PC不像手机可以用GPRS来定位)。鼠标移动到ta的名片上就会显示出ta最近使用云播观看的3部影片的文件名，不管你愿不愿意，你最近看的3部影片的文件名都会在那个地方显示。当然被你扫到了然后又被你看到了我最近观看的影片这并没什么大问题，因为通常我被你扫到了你也不知道我是谁。但是在搜索附近的人的上面有个按帐号查找的，这个目的性就很强了，查到后就可以不需要加对方为好友就能知道对方最近看了什么片子，对于注重隐私的人来说，这是一个难以接受的设定，至少我认为通过帐号直接搜索的应该应该设定为在好友请求被通过后才能查看对方的播放记录。最奇葩的是右上角有个举报按钮，我只能说“卧槽，这又不是我主动分享的，你举报我干嘛！”。</summary>
    
    
    
    <category term="吐槽" scheme="https://blog.poxiao.me/category/tucao/"/>
    
    
    <category term="云播" scheme="https://blog.poxiao.me/tag/cloudplay/"/>
    
    <category term="吐槽" scheme="https://blog.poxiao.me/tag/tucao/"/>
    
    <category term="迅雷" scheme="https://blog.poxiao.me/tag/xunlei/"/>
    
  </entry>
  
  <entry>
    <title>Windows Phone 8中MediaElement的音量控制</title>
    <link href="https://blog.poxiao.me/p/wp8-mediaelement-volume-control/"/>
    <id>https://blog.poxiao.me/p/wp8-mediaelement-volume-control/</id>
    <published>2013-10-10T14:57:09.000Z</published>
    <updated>2013-10-11T15:32:46.000Z</updated>
    
    
    <summary type="html">&lt;p&gt;在Windows Phone 8上使用MediaElement的时候发现一个很奇怪的现象。按照MSDN的说法，MediaElement的Volume属性可以通过设置0&lt;del&gt;1之间的值来设置媒体音量(0为最小音量，1为最大音量)，其默认值为0.5。然而在实际的使用中发现其默认值并不是如MSDN中所说的0.5而是1，且音量并不随着Volume从0到1均匀变化。在0&lt;/del&gt;0.7之间声音很小几乎听不见，0.7之后开始有明显的声音，且在0.75~1.0这个区间内改变Volume的值音量随Volume的变化明显。&lt;/p&gt;
&lt;p&gt;由此看来，音量(z)随Volume属性的值(y)的变化的函数z &amp;#x3D; g(y)的函数图像近似于指数函数图像沿y轴负方向移动一个单位(因为g(0) &amp;#x3D; 0)。对于用户来说通过滑动一个范围为0~1的音量条来调节音量，通常用户所期望的是音量(z)能随着音量条的值(x)以一次函数z&amp;#x3D;h(x)均匀变化，而非以指数函数变化。&lt;/p&gt;
&lt;p&gt;由于要改变MediaElement的音量只能通过设置Volume属性来达到，因此需要找到一个合适的转换函数f(x) &amp;#x3D; y满足z &amp;#x3D; g(y) &amp;#x3D; g(f(x)) &amp;#x3D; h(x) &amp;#x3D; kx，(其中k为大于1的常数)。&lt;/p&gt;</summary>
    
    
    
    <category term="WindowsPhone" scheme="https://blog.poxiao.me/category/windowsphone/"/>
    
    
    <category term="C++" scheme="https://blog.poxiao.me/tag/cpp/"/>
    
    <category term="C#" scheme="https://blog.poxiao.me/tag/csharp/"/>
    
    <category term="MediaElement" scheme="https://blog.poxiao.me/tag/mediaelement/"/>
    
    <category term="WP8" scheme="https://blog.poxiao.me/tag/wp8/"/>
    
  </entry>
  
  <entry>
    <title>用C++写了个Windows Phone 8的FLV视频分离器</title>
    <link href="https://blog.poxiao.me/p/wp8-streaming-flv-h264-aac/"/>
    <id>https://blog.poxiao.me/p/wp8-streaming-flv-h264-aac/</id>
    <published>2013-09-21T13:47:41.000Z</published>
    <updated>2015-04-05T22:28:45.000Z</updated>
    
    
      
      
        
        
    <summary type="html">&lt;p&gt;Windows Phone 8是不支持播放FLV视频文件的。所以用C++写了个FLV视频分离器，目前仅支持AAC音频编码和H.264视频编码，支持拖动播放（仅当metadata中带有关键帧信息）。再由C#对C++进行封装，C#中封装的类继承自&lt;a</summary>
        
      
    
    
    
    <category term="WindowsPhone" scheme="https://blog.poxiao.me/category/windowsphone/"/>
    
    
    <category term="C++" scheme="https://blog.poxiao.me/tag/cpp/"/>
    
    <category term="C#" scheme="https://blog.poxiao.me/tag/csharp/"/>
    
    <category term="FLV" scheme="https://blog.poxiao.me/tag/flv/"/>
    
    <category term="WP8" scheme="https://blog.poxiao.me/tag/wp8/"/>
    
    <category term="AAC" scheme="https://blog.poxiao.me/tag/aac/"/>
    
    <category term="H264" scheme="https://blog.poxiao.me/tag/h264/"/>
    
  </entry>
  
</feed>
