
并发
wuyue五月
这个作者很懒,什么都没留下…
展开
-
信号量 互斥锁 条件变量的区别(讲的很好,值得收藏)
信号量用在多线程多任务同步的,一个线程完成了某一个动作就通过信号量告诉别的线程,别的线程再进行某些动作(大家都在semtake的时候,就阻塞在哪里)。而互斥锁是用在多线程多任务互斥的,一个线程占用了某一个资源,那么别的线程就无法访问,直到这个线程unlock,其他的线程才开始可以利用这个资源。比如对全局变量的访问,有时要加锁,操作完了,在解锁。有的时候锁和信号量会同时使用的”也就是说,信号量不转载 2015-03-16 23:13:54 · 651 阅读 · 0 评论 -
线程安全与可重入
源出处:http://waret.iteye.com/blog/744169线程安全函数 • 概念: 线程安全的概念比较直观。一般说来,一个函数被称为线程安全的,当且仅当被多个并发线程反复调用时,它会一直产生正确的结果。 • 确保线程安全: 要确保函数线程安全,主要需要考虑的是线程之间的共享变量。属于同一进程的不同线程会共享进程内存空间中的全转载 2016-04-30 20:18:51 · 385 阅读 · 0 评论 -
I/O并发模式:Reactor模式与Proactor模式 总价
首先最好拜读下《Unix网络编程第一卷:套接口API》第6章关于I/O模型的讲解非常经典,首先搞清楚何为阻塞和非阻塞,何为同步和异步。Reactor模式Proactor介绍和应用实例高性能IO设计的Reactor和Proactor模式高性能I/O设计模式Reactor和ProactorLinux——epollLinux下tcp并发服务器的几种设计的模式套路 《高性能IO转载 2016-05-14 17:25:29 · 628 阅读 · 0 评论 -
reactor和proactor模式
转载地址:http://blog.youkuaiyun.com/caiwenfeng_for_23/article/details/8458299首先分享一下,我在网上看到的两篇不错的文章:正是这两篇文章才理解了reactor和proactor模式; Reactor模式,或者叫反应器模式高性能IO设计的Reactor和Proactor模式 首先就第一篇《Reactor模式,或者叫反应器模式转载 2016-05-14 20:53:21 · 298 阅读 · 0 评论 -
IO - 同步,异步,阻塞,非阻塞
转载地址:http://blog.youkuaiyun.com/historyasamirror/article/details/5778378当你发现自己最受欢迎的一篇blog其实大错特错时,这绝对不是一件让人愉悦的事。《 IO - 同步,异步,阻塞,非阻塞》是我在开始学习epoll和libevent的时候写的,主要的思路来自于文中的那篇link。写完之后发现很多人都很喜欢,我还是非常开心的,也转载 2016-05-14 20:55:05 · 271 阅读 · 0 评论 -
Linux下线程的挂起和恢复
转载地址:http://blog.chinaunix.net/uid-21765995-id-1815655.htmlPOSIX的Linux操作系统没有提供线程挂起和恢复的例程,在网上找了找,看到一个老外写的程序,感觉想法不错,放在这里大家分享一下。理论上应该可以实现,不过我没有试,给大家提供一个参考。(在读取缓存里的数据时,当缓存中没有数据最好把线程挂起)void CPrcThr转载 2016-06-26 18:45:17 · 2037 阅读 · 0 评论 -
用户级线程和内核级线程
转载地址:http://blog.sina.com.cn/s/blog_aed82f6f0102vxm9.html1.内核级线程:(1)线程的创建、撤销和切换等,都需要内核直接实现,即内核了解每一个作为可调度实体的线程。(2)这些线程可以在全系统内进行资源的竞争。(3)内核空间内为每一个内核支持线程设置了一个线程控制块(TCB),内核根据该控制块,感知线程的存在转载 2016-06-26 19:18:11 · 4787 阅读 · 0 评论 -
非阻塞同步算法与CAS(Compare and Swap)无锁算法
转载地址:http://www.cnblogs.com/Mainz/p/3546347.html锁(lock)的代价锁是用来做并发最简单的方式,当然其代价也是最高的。内核态的锁的时候需要操作系统进行一次上下文切换,加锁、释放锁会导致比较多的上下文切换和调度延时,等待锁的线程会被挂起直至锁释放。在上下文切换的时候,cpu之前缓存的指令和数据都将失效,对性能有很大的损失。操作系统对转载 2016-07-04 09:11:45 · 833 阅读 · 0 评论 -
Reactor模式及在DSS中的体现
转载地址:http://www.cnblogs.com/MikeZhang/archive/2012/08/16/ReactorPattern20120815.htmlReactor模式是处理并发I/O比较常见的一种模式,用于同步I/O,中心思想是将所有要处理的I/O事件注册到一个中心I/O多路复用器上,同时主线程阻塞在多路复用器上;一旦有I/O事件到来或是准备就绪(区别在于多路复用器是边转载 2016-07-19 14:00:05 · 729 阅读 · 0 评论 -
fork()函数与Linux中的多线程编程
转载请说明出处:http://blog.youkuaiyun.com/cywosp/article/details/27316803一、fork()函数 在操作系统的基本概念中进程是程序的一次执行,且是拥有资源的最小单位和调度单位(在引入线程的操作系统中,线程是最小的调度单位)。在Linux系统中创建进程有两种方式:一是由操作系统创建,二是由父进程创建进程(通常为子进程)。系统调用函数f转载 2016-07-30 18:25:08 · 315 阅读 · 0 评论 -
双缓存消息队列设计综述
仅从双缓存消息队列的技术角度去分析。使用双缓存方法去实现异步日志是否是比较有效方式,待讨论。双缓冲消息队列-减少锁竞争在网络应用服务器端, 为了性能和防止阻塞, 经常会把逻辑处理和I/O处理分离:I/O网络线程处理I/O事件: 数据包的接收和发送, 连接的建立和维护等.逻辑线程要对收到的数据包进行逻辑处理.通常网络线程和逻辑线程之间是通过数据包队列来交换信息, 简单来说转载 2016-08-08 13:19:55 · 1943 阅读 · 0 评论 -
epoll使用详解(精髓)
epoll - I/O event notification facility在linux的网络编程中,很长的时间都在使用select来做事件触发。在linux新的内核中,有了一种替换它的机制,就是epoll。相比于select,epoll最大的好处在于它不会随着监听fd数目的增长而降低效率。因为在内核中的select实现中,它是采用轮询来处理的,轮询的fd数目越多,自然耗时越多。并且转载 2016-05-14 17:12:57 · 347 阅读 · 0 评论 -
Linux锁机制
在linux内核中,有很多同步机制。比较经典的有原子操作、spin_lock(忙等待的锁)、mutex(互斥锁)、semaphore(信号量)等。并且它们几乎都有对应的rw_XXX(读写锁),以便在能够区分读与写的情况下,让读操作相互不互斥(读写、写写依然互斥)。而seqlock和rcu应该可以不算在经典之列,它们是两种比较有意思的同步机制。atomic(原子操作):所谓原子操作,就是该操转载 2015-08-21 09:57:56 · 1688 阅读 · 0 评论 -
pthread_cond_signal与pthread_cond_wait详解
//pthread_cond_signal 只发信号,内部不会解锁,在Linux线程中,有两个队列,分别是cond_wait队列和mutex_lock队列, cond_signal只是让线程从cond_wait队列移到mutex_lock队列,而不用返回到用户空间,不会有性能的损耗。(pthread_cond_signal unlock后pthread_cond_wait才能上锁)转载 2015-03-24 22:56:48 · 1157 阅读 · 0 评论 -
内存使用技巧及内存池实现(一)
转载地址:http://blog.youkuaiyun.com/gugemichael/article/details/7543788本文只是展示了一些基本的内存管理技巧,处于篇幅没有更深入的讲解,有兴趣可回复一起探讨^_^ 在当前的软件开发环境下,主要分为两大类:客户端和服务端。软件部署在客户端的情况逐渐被Web应用和服务端的网络应用所替代(游戏客户端例外),并且随着硬件的不断升级和成转载 2015-08-16 16:44:28 · 480 阅读 · 0 评论 -
内存使用技巧及内存池实现(二)
转载地址:http://blog.youkuaiyun.com/gugemichael/article/details/7547143 上一章节,提到了内存池的使用。其实内存池的作用看名字也能猜到,"池"意味着资源是同一管理和创建释放的,就像数据库的连接池、系统的线程池。主要就是为了避免创建、销毁资源的代价。c标准的malloc/free会造成大量的内存碎片以至于影响效率,所以“内存池”的技术某种程转载 2015-08-16 16:45:17 · 345 阅读 · 0 评论 -
用于并行计算的多线程数据结构,第 1 部分: 设计并发数据结构
转载地址:http://www.ibm.com/developerworks/cn/aix/library/au-multithreaded_structures1/index.html简介现在,您的计算机有四个 CPU 核;并行计算 是最时髦的主题,您急于掌握这种技术。但是,并行编程不只是在随便什么函数和方法中使用互斥锁和条件变量。C++ 开发人员必须掌握的关键技能之一是设计并发数据转载 2015-08-20 10:42:36 · 467 阅读 · 0 评论 -
设计不使用互斥锁的并发数据结构
用于并行计算的多线程数据结构,第 2 部分: 设计不使用互斥锁的并发数据结构本文是讨论多线程结构的两篇系列文章的第二篇,介绍关于实现基于互斥锁的并发链表的设计方法,讨论如何设计不使用互斥锁的并发数据结构。转载地址:http://www.ibm.com/developerworks/cn/aix/library/au-multithreaded_structures2/index.html转载 2015-08-20 09:19:24 · 954 阅读 · 0 评论 -
ZeroMQ研究与应用分析
1 ZeroMQ概述ZeroMQ是一种基于消息队列的多线程网络库,其对套接字类型、连接处理、帧、甚至路由的底层细节进行抽象,提供跨越多种传输协议的套接字。ZeroMQ是网络通信中新的一层,介于应用层和传输层之间(按照TCP/IP划分),其是一个可伸缩层,可并行运行,分散在分布式系统间。2 系统架构2.1总体架构ZeroMQ几乎所有的I/O操作都是异步的,主线程不会被阻塞转载 2015-12-21 14:12:21 · 493 阅读 · 0 评论 -
关于linux多线程同时对一个fd做select
多线程(多进程也是差不多的情况),select同一个fd,发现在某些情况下面,的确会有多个线程(进程)被唤醒,然后只有一个线程能够accept(stream类型的fd)或者recv(如果是diagram的fd),其它的则会在accept或recv处阻塞,当然如果把fd设成非阻塞的,则会返回一个失败。所以多线程同时select一个fd时,还是把fd设成非阻塞的,省得麻烦。因为循环处理时,往往也顺转载 2016-02-25 09:27:36 · 4960 阅读 · 0 评论 -
用于并行计算的多线程数据结构,第 2 部分: 设计不使用互斥锁的并发数据结构
转载地址:https://www.ibm.com/developerworks/cn/aix/library/au-multithreaded_structures2/简介本文是本系列的最后一篇,讨论两个主题:关于实现基于互斥锁的并发链表的设计方法和设计不使用互斥锁的并发数据结构。对于后一个主题,我选择实现一个并发堆栈并解释设计这种数据结构涉及的一些问题。用C++ 设计独立转载 2016-04-13 20:22:16 · 489 阅读 · 0 评论 -
多个线程调用同一个处理函数的互斥问题
问题背景:在工作中遇到过一个问题,就是在两个线程同时调用同一个函数的时候,到底是应该在这个函数的内部什么处理上加上互斥。原因又是什么?为了调查这个问题,我决定从以下三方面调查1.线程中函数的调用2.同一个进程中的两个线程调用同一个处理函数3.两个不同进程中的两个线程调用同一个处理函数1.线程中函数的调用每个进程都会有自己的虚拟地址空间,同一个进程中的每个线程都会在这转载 2015-08-20 17:53:47 · 6044 阅读 · 0 评论 -
Linux多线程编程小结
Linux多线程编程小结 前一段时间因为开题的事情一直耽搁了我搞Linux的进度,搞的我之前学的东西都遗忘了,很烦躁的说,现在抽个时间把之前所学的做个小节。文章内容主要总结于《Linux程序设计第3版》。1.Linux进程与线程 Linux进程创建一个新线程时,线程将拥有自己的栈(因为线程有自己的局部变量),但与它的创建者共享全局变量、文件描述符、信号句柄和转载 2015-03-29 23:31:22 · 359 阅读 · 0 评论 -
eventfd以及epoll原理分析
这两天公司代码中用到了epoll。然后在跟同事闲扯的过程中发现了Linux中有eventfd。两者虽然名字看起来差不多,但是相关性倒是不多。为了弄明白这两个东西到底在内核上是怎么实现的,这两天将内核这两个部分的相关代码看了下,也终于明白了这两个东西的实现机制。后续几篇博客我尽量将这两个东西的工作原理阐述清楚,但是自己的语言表达能力比较差,也只能是尽量了。今天这篇博客首先是介绍两者的转载 2015-03-29 23:10:58 · 1307 阅读 · 0 评论 -
linux中pid,tid, 以及 真实pid的关系
1、pid,tid,真实pid的使用进程pid: getpid() 线程tid: pthread_self() //进程内唯一,但是在不同进程则不唯一。线程pid: syscall(SYS_gettid) //系统内是唯一的#include #include #include #include struct messag转载 2016-08-11 16:19:08 · 61817 阅读 · 0 评论