04 2012 档案
摘要:一、什么是条件变量与互斥锁不同,条件变量是用来等待而不是用来上锁的。条件变量用来自动阻塞一个线程,直到某特殊情况发生为止。通常条件变量和互斥锁同时使用。条件变量使我们可以睡眠等待某种条件出现。条件变量是利用线程间共享的全局变量进行同步的一种机制,主要包括两个动作:一个线程等待"条件变量的条件成立"而挂起;另一个线程使"条件成立"(给出条件成立信号)。条件的检测是在互斥锁的保护下进行的。如果一个条件为假,一个线程自动阻塞,并释放等待状态改变的互斥锁。如果另一个线程改变了条件,它发信号给关联的条件变量,唤醒一个或多个等待它的线程,重新获得互斥锁,重新评价条件
阅读全文
摘要:四种进程或线程同步互斥的控制方法1、临界区:通过对多线程的串行化来访问公共资源或一段代码,速度快,适合控制数据访问。2、互斥量:为协调共同对一个共享资源的单独访问而设计的。3、信号量:为控制一个具有有限数量用户资源而设计。4、事件:用来通知线程有一些事件已发生,从而启动后继任务的开始。临界区(Critical Section)临界区: 不论是硬件临界资源,还是软件临界资源,多个进程必须互斥地对它进行访问。每个进程中访问临界资源的那段代码称为临界区(Critical Section)(临界资源是一次仅允许一个进程使用的共享资源)。每次只准许一个进程进入临界区,进入后不允许其他进程进入。不论是硬件
阅读全文
摘要:可执行文件格式主要是:Windows下的PE(Portable Executable)和Linux的ELF(Executable Linkable Format)他们都是COFF(Common file format)格式的变种。目标文件就是源代码编译后但未进行链接的那些中间文件。动态链接库(windows的.dll和Linux的.so)及静态链接库(Windows的.lib和Linux的.a)文件都按照可执行文件格式存储。在Linux下可以使用file命令来查看相应的文件格式:$ file first.shfirst.sh: POSIX shell script, ASCII text ex
阅读全文
摘要:从源文件到可以行文件的过程:预处理——编译——汇编——链接第一步预编译:$gcc -E hello.c -o hello.i或者$cpp hello.c > hello.i注:‘-E’选项表示只进行预编译;cpp是预编译器预编译主要处理一‘#’开头的预编译指令:将所有的"#define"删除,并且展开所有的宏定义处理所有条件预编译指令处理"#include",将包含的文件插入到该预编译指令的位置。注意,这个过程是递归进行删除所有注释添加行号和文件名标识,以便于调试和编译产生的错误和警告保留所有"#pragma"指令,编译器需要使
阅读全文
摘要:从helloworld说起:#include <stdio.h>int main(){printf("Hello,World\n");return 0;}你能回答如下问题吗? ·程序为什么要经过编译才能运行?·编译器把C语言转化为可执行的机器码的过程做了什么,怎么做的 ·最后编译出来的可执行文件里面是什么?除了机器码之外还有什么?它们是怎么存放,怎么组织的?·#include<stdio.h>是什么意思?把stdio.h包含进来意味着什么?C语言库又是什么?它怎么实现的? ·不同的编译器(VC,GCC
阅读全文
摘要:这段时间都没有更新博客,主要在看“程序员的自我修养”这本书,去年暑假的时候看过一下,但是看得很快,而且对着纸质书看,也没有什么具体的操作,更没有对不懂的问一下Google或者百度了。在这接近一个月的时间里面我重新看了这本书,首先花了一个多星期看了一遍,然后又花了两个星期来做笔记,把里面的代码都跑了一遍,使用的环境是:Visual Studio 11 Beta 、Ubuntu10.04还有Cygwin(简单的就用这个)。对不懂的基本上都在网上找了相应的东西来扩展学习,总的来说映像还是较深了,收获比较大。看的过程中有些部分还是比较痛苦的,但是也有觉得比较新奇很有兴趣。目标就在那里,不能因为需要..
阅读全文
摘要:独立主格结构 A : n. + present participle phrase (名词 + 现在分词短语) 到处都可以看见人们穿着节日服装,满脸笑容 Everywhere you can see people in their holiday dresses, their faces shining with smiles 天气要是合适,我们明天去西山玩 Weather promising, we'll go on an excursion to the Western Hill tomorrow. B: n. + past participle phrase (名词 + 加过程去
阅读全文
摘要:下面是一个生产者消费者问题,来介绍condition_variable的用法。当线程间的共享数据发生变化的时候,可以通过condition_variable来通知其他的线程。消费者wait 直到生产者通知其状态发生改变,Condition_variable是使用方法如下:·当持有锁之后,线程调用wait·wait解开持有的互斥锁(mutex),阻塞本线程,并将自己加入到唤醒队列中·当收到通知(notification),该线程从阻塞中恢复,并加入互斥锁队列(mutex queue)线程被唤醒之后继续持有锁运行。Condition variable有两种类型:con
阅读全文
摘要:C++11开始支持多线程编程,之前多线程编程都需要系统的支持,在不同的系统下创建线程需要不同的API如pthread_create(),Createthread(),beginthread()等,使用起来都比较复杂,C++11提供了新头文件<thread>、<mutex>、<atomic>、<future>等用于支持多线程。使用C++11开启一个线程是比较简单的,下面来看一个简单的例子:#include <thread>#include <iostream>void hello(){ std::cout <<
阅读全文
摘要:C++11从去年开始接触的,首先接触的是boost,在VS2010上玩了一下,但是没有看太多。后面接触到C++11,第一个下载的资料室Scott Myers 的overview of C++0x,之后九月份C++11出了新标准,我下载了ISOICE14882 C++11的pdf,感觉看不懂,也没有太多时间研究这个,于是也就是当资料查查了。从去年末很多网络上的朋友都有在发一些C++11的文章,我也开始学习他们发的博客,然后结合自己的理解和上面提到的资料还有几个网站来学习,我这些程序都是在VC11下编译通过的。总共有几个部分:tuple,正则表达式,lambda表达式,多线程。我都是先写在wo..
阅读全文
摘要:下面一个例子将进行年月日格式的转换,将DD-MM-YYYY –> YYYY-MM-DD,其中‘.’或者‘/’都能正确识别。#include <regex>#include <iostream>#include <string>std::string format_date(const std::string& date){ // regular expression const std:: regex pattern("(\\d{1,2})(\\.|-|/)(\\d{1,2})(\\.|-|/)(\\d{4})"); //
阅读全文
摘要:下面来介绍和regex_match()很像的regex_search()的使用实例,regex_match()要求正则表达式必须与模式串完全匹配,regex_search()只要求存在匹配项就可以。#include <regex>#include <iostream>#include <string>int main(){ const std::tr1::regex pattern("(\\w+day)"); // the source text std::string weekend = "Saturday and Sunda
阅读全文
摘要:该实例通过一个函数is_email_valid 来检查一个email地址是否是一个正确的格式。如果格式正确则返回true。#include <regex>#include <iostream>#include <string>bool is_email_valid(const std::string& email){ const std::regex pattern("(\\w+)(\\.|_)?(\\w*)@(\\w+)(\\.(\\w+))+"); return std::regex_match(email, pattern)
阅读全文
摘要:C++11开始支持正则表达式,使得处理文本更加简洁方便。C++11 支持六种正则表达式语法:ECMAScript, basic(POSIX Basic Regular Expressions), extended(POSIX Extended Regular Expressions ), awk(POSIX awk) , grep(POSIX grep ), egrep(POSIX grep –E)。其中ECMAScript最为强大。闲话不多说,首先来看正则表达式有哪些基本类型。basic_regex: 这是一个包含一个正则表达式的模板类。通常有两种特化方式:a) typedef basic_
阅读全文
摘要:tuple元组定义了一个有固定数目元素的容器,其中的每个元素类型都可以不相同,这与其他容器有着本质的区别.是对pair的泛化。首先来介绍元组的创建和元组元素的访问。通过make_tuple()创建元组,通过get<>()来访问元组的元素。通过下面这段程序来认识这两个函数的用法:#include <iostream>#include <tuple>#include <functional>int main(){ auto t1 = std::make_tuple(10, "Test", 3.14); std::cout <
阅读全文
摘要:C++11引入了lambda表达式,使得程序员可以定义匿名函数,该函数是一次性执行的,既方便了编程,又能防止别人的访问。Lambda表达式的语法通过下图来介绍: 这里假设我们定义了一个如上图的lambda表达式。现在来介绍途中标有编号的各个部分是什么意思。Lambda表达式的引入标志,在‘[]’里面可以填入‘=’或‘&’表示该lambda表达式“捕获”(lambda表达式在一定的scope可以访问的数据)的数据时以什么方式捕获的,‘&’表示一引用的方式;‘=’表明以值传递的方式捕获,除非专门指出。Lambda表达式的参数列表Mutable 标识异常标识返回值“函数”体,也就是l
阅读全文