摘要: printf输出条件: (1) 调用fflush; (2) 缓冲区满了; (3) 遇到\n \r这些字符 (4) 遇到scanf这些要取缓冲区的; (5) 线程或者进程退出; fork之后会拷贝父进程的缓冲区; 代码: 结果: (1) 第一次输入到控制台,write无缓冲直接输出,printf("b 阅读全文
posted @ 2016-04-01 18:57 AlexAlex 阅读(1038) 评论(0) 推荐(0)
摘要: 1. 线程同步: 当多个控制线程共享相同的内存时,需要确保每个线程看到一致的数据视图。当某个线程可以修改变量,而其他线程也可以读取或者修改这个变量的时候,就需要对这些线程进行同步,以确保他们在访问变量的存储内容的时候不会访问到无效的数值; 当一个线程修改变量时,其他线程在读取这个变量的值的时候可能看 阅读全文
posted @ 2016-04-01 15:03 AlexAlex 阅读(353) 评论(0) 推荐(0)
摘要: 相交进程之间的关系主要有两种,同步与互斥。所谓互斥,是指散步在不同进程之间的若干程序片断,当某个进程运行其中一个程序片段时,其它进程就不能运行它 们之中的任一程序片段,只能等到该进程运行完这个程序片段后才可以运行。所谓同步,是指散步在不同进程之间的若干程序片断,它们的运行必须严格按照规定的 某种先后 阅读全文
posted @ 2016-04-01 14:12 AlexAlex 阅读(168) 评论(0) 推荐(0)
摘要: output: 阅读全文
posted @ 2016-04-01 13:51 AlexAlex 阅读(737) 评论(0) 推荐(0)
摘要: 如网络编程中accept之后等待数据到达,并且读取数据为例: Reactor: 基于同步IO 1. 线程等待读取socket数据,将socketfd添加到事件分派器中,如添加到epoll; 2. 事件分派器阻塞等待socketfd可读事件发生; 3. 若数据到达,socketfd变成可读状态,事件分 阅读全文
posted @ 2016-03-31 10:21 AlexAlex 阅读(528) 评论(0) 推荐(0)
摘要: 1. 临界区和竞态条件: 临界区:访问和操作共享数据的代码段; 竞态条件:当有多个线程同时进入临界区时,执行结果取决于线程的执行顺序; 如下述代码,当多个线程同时调用func函数,对共享数据sum进行操作,实际上我们得到的结果则依赖于执行的相对时间; 线程1在a.取出sum值,然后b.对sum+1, 阅读全文
posted @ 2016-03-30 18:05 AlexAlex 阅读(714) 评论(0) 推荐(0)
摘要: 1. 伪共享产生: 在SMP架构的系统中,每个CPU核心都有自己的cache,当多个线程在不同的核心上,并且某线程修改了在同一个cache line中的数据时,由于cache一致性原则,其他核心cache中相同cache line会失效,从而产生cache miss,并重新从内存中读入数据到cach 阅读全文
posted @ 2016-03-30 11:11 AlexAlex 阅读(547) 评论(0) 推荐(0)
摘要: restrict是c99标准引入的,它只可以用于限定和约束指针,并表明指针是访问一个数据对象的唯一且初始的方式.即它告诉编译器,所有修改该指针所指向内存中内容的操作都必须通过该指针来修改,而不能通过其它途径(其它变量或指针)来修改;这样做的好处是,能帮助编译器进行更好的优化代码,生成更有效率的汇编代 阅读全文
posted @ 2016-03-29 14:33 AlexAlex 阅读(548) 评论(0) 推荐(0)
摘要: 1. 线程标识: (1) 比较两个线程ID; (2) 获取线程自身ID; 2. 线程的创建: 3. 线程的终止: (1) 线程只是从启动例程中返回,返回值是线程的退出码; (2) 线程可以被同一例程中的其他线程取消; (3) 线程调用pthread_exit。 rval_ptr是一个无类型指针,与传 阅读全文
posted @ 2016-03-28 22:34 AlexAlex 阅读(2477) 评论(0) 推荐(0)
摘要: 1. signal函数: 比较容易理解的形式: 三个宏定义: SIG_ERR: 信号注册失败返回SIG_ERR SIG_DFL: 采用系统对此信号的默认动作; SIG_IGN: 忽略此信号,注意SIGKILL和SIGSTOP不能忽略; 这三个宏定义不是一定要使用上面的三个值,但是必须是不能声明函数的 阅读全文
posted @ 2016-03-28 13:40 AlexAlex 阅读(404) 评论(0) 推荐(0)