以libevent网络库为引:网络通信和多线程

1. windows下编译及使用libevent  http://www.cnblogs.com/luxiaoxun/p/3603399.html

2.  <<libevent学习资料>> http://blog.csdn.net/tge7618291/article/details/7698813

3. 源代码编译安装Memcache及libevent库依赖性的解决实例 (安装libevent) http://www.tudou.com/programs/view/yY21BGwIgLU 

http://libevent.org/上下载最新的libevent, 如 libevent-2.0.22-stable.tar.gz。然后解压,按照README里面的步骤安装。

4.  Programming with Libevent  http://www.wangafu.net/~nickm/libevent-book/

 Learning Libevent

A Libevent Reference Manual

 5. libevent简介和使用 http://www.open-open.com/lib/view/open1386510630330.html

————————————————————————————————————————————————————————————

f1. 浅谈Volatile与多线程 http://renyan.spaces.eepw.com.cn/articles/article/item/86826

  在C/C++中,如果想把一个变量声明为volatile,就相当于告诉编译器这个变量是“易变的”,他随时可能在其他地方被修改,所以编译器不能对其做任何变化:即每次读写该变量时都必须对其内存地址直接进行操作,并且所以对该变量的操作都必须严格按照程序中规定的顺序执行。举例来说,编译器的常常做的一种性能优化就是把需频繁读取的变量缓存到寄存器中,以提升访问速度。但如果该变量的值随时可能在片外被改变的话,那么就有可能出现被缓存的值并不是该变量的最新值情况,从而出现运行错误。在这种情况就需要用volatile关键字来修饰这个变量,以确保编译器不会对该变量读写操作进行任何缓存优化。另一个例子就是内存映射I/O操作。如下代码所示:
Int *p = get_io_address();
Int a, b;
A = *p;
B = *p;
P是一个指向硬件I/O端口的指针,该端口的值在每进行一次读操作后都会变化。这个程序连续对该端口进行两次读取操作已将两个不同的值分别赋值给a和b。如果不把a和b声明为volatile的话,编译器可能会”自作聪明”地认为两次从p读取的值都是一样的,从而把*b=*p优化成b = a,最终导致程序出错。
 
然而:
虽然C/C++中volatile关键字对这种“易变“的读写操作能起到一定的保护,但他却并不适用于多线程程序中共享变量的同步操作。究其根源,就在于C/C++标准中并没有volatile赋予原子性和顺序性的语义。

更多的解释见原文http://renyan.spaces.eepw.com.cn/articles/article/item/86826

f2.几种服务器端IO模型的简单介绍及实现 http://www.cnblogs.com/luxiaoxun/p/3691800.html

服务器端几种模型:

1、阻塞式模型(blocking IO)
2、多线程的服务器模型(Multi-Thread)
3、非阻塞式模型(Non-blocking IO)
4、多路复用IO
5、使用事件驱动库libevent的服务器模型
6、信号驱动IO模型(Signal-driven IO)
7、异步IO模型(asynchronous IO)

 

原文地址:https://www.cnblogs.com/mylinux/p/5195262.html