
linux多线程编程
文章平均质量分 81
鱼思故渊
这个作者很懒,什么都没留下…
展开
-
网络编程-线程池模型的使用
线程池服务模型是single thread 与 request per thread两种模型的折中方案,其在实现时通常需要借助任务队列,主线程往任务队列尾添加任务,线程池中的服务线程不断从任务队列头取任务并服务,如下图所示: 对于主线程和服务线程来说,任务队列是临界资源,需要加锁进行保护。主线程往任务队列添加任务时需要加锁,服务线程从任务队列取任务也许加锁,当服务线程发现任务队列转载 2013-12-19 19:23:40 · 2804 阅读 · 5 评论 -
线程同步互斥的控制方法 互斥信号量区别
四种进程或线程同步互斥的控制方法 1、临界区:通过对多线程的串行化来访问公共资源或一段代码,速度快,适合控制数据访问。 2、互斥量:为协调共同对一个共享资源的单独访问而设计的。 3、信号量:为控制一个具有有限数量用户资源而设计。 4、事 件:用来通知线程有一些事件已发生,从而启动后继任务的开始。 临界区(Critical Section)原创 2013-10-13 19:58:21 · 2347 阅读 · 2 评论 -
linux中的线程池
一、线程池大多数的网络服务器,包括Web服务器都具有一个特点,就是单位时间内必须处理数目巨大的连接请求,但是处理时间却是比较短的。在传统的多线程服务器模型中是这样实现的:一旦有个请求到达,就创建一个新的线程,由该线程执行任务,任务执行完毕之后,线程就退出。这就是"即时创建,即时销毁"的策略。尽管与创建进程相比,创建线程的时间已经大大的缩短,但是如果提交给线程的任务是执行时间较短,而且执行次原创 2014-01-17 10:15:07 · 2534 阅读 · 2 评论 -
Linux 多线程应用中如何编写安全的信号处理函数
关于代码的可重入性,设计开发人员一般只考虑到线程安全,异步信号处理函数的安全却往往被忽略。本文首先介绍如何编写安全的异步信号处理函数;然后举例说明在多线程应用中如何构建模型让异步信号在指定的线程中以同步的方式处理。Linux 多线程应用中编写安全的信号处理函数在开发多线程应用时,开发人员一般都会考虑线程安全,会使用 pthread_mutex 去保护全局变量。如果应用中使用了信号,转载 2013-11-06 16:00:01 · 2547 阅读 · 0 评论 -
线程间同步--互斥锁、条件变量、信号量
一、互斥锁(mutex)在上一篇文章中讲到的互斥锁,说的是在多线程之间为了保持同步而使用的。但是什么是线程同步呢,为了保持线程同步都可以采用什么策略?多个线程同时访问共享数据时可能会冲突,这跟前面讲信号时所说的可重入性是同样的问题。比如两个线程都要把某个全局变量增加1,这个操作在某平台需要三条指令完成:从内存读变量值到寄存器寄存器的值加1将寄存器的值原创 2013-11-05 08:53:45 · 8161 阅读 · 1 评论 -
多线程中的信号机制--sigwait()函数
在Linux的多线程中使用信号机制,与在进程中使用信号机制有着根本的区别,可以说是完全不同。在进程环境中,对信号的处理是,先注册信号处理函数,当信号异步发生时,调用处理函数来处理信号。它完全是异步的(我们完全不知到信号会在进程的那个执行点到来!)。然而信号处理函数的实现,有着许多的限制;比如有一些函数不能在信号处理函数中调用;再比如一些函数read、recv等调用时会被异步的信号给中断(inter原创 2013-11-06 18:41:29 · 16497 阅读 · 1 评论 -
常见多线程并发服务器编程模型
一、3点基础知识1、一个主机的端口号为所有进程所共享,但普通用户进程绑定不了一些特殊端口号如20、80等。 2、每个进程都有自己的文件描述符(包括file fd, socket fd, timer fd, event fd, signal fd),一般是1024,可以通过ulimit -n 设置,但所有进程打开的文件描述符总数有上限,跟主机的内存有关。3、一个进原创 2013-12-26 20:52:18 · 4448 阅读 · 1 评论 -
线程同步、条件变量、互斥锁的使用
线程间的同步技术,主要以互斥锁和条件变量为主,条件变量和互斥所的配合使用可以很好的处理对于条件等待的线程间的同步问题。举个例子:当有两个变量x,y需要在多线程间同步并且学要根据他们之间的大小比较来启动不同的线程执行顺序,这便用到了条件变量这一技术。看代码 #include #include using namespace std; pthread_con原创 2013-11-05 09:44:19 · 8519 阅读 · 5 评论 -
linux多线程编程的基本规则
准则1:不依赖于信号收发的设计。 给其它进程以及自己发送异步信号并改变处理流程的设计不要做。不要把信号和线程一起使用,这将使得程序动作的预测和调试变得困难。准则2:要知道信号处理函数中可以做哪些处理。 在sigaction()函数登记的信号处理函数中可以做的处理是被严格限定的。仅允许:局部变量的相关处理volatile sig_atomic_t类型的全局变量操作转载 2013-11-06 22:40:53 · 1466 阅读 · 0 评论 -
多线程私有资源和共享资源
一、线程概念 线程是操作系统能够进行运算调度的最小单位。它被包含在进程之中,是进程中的实际运作单位。一条线程指的是进程中一个单一顺序的控制流,一个进程中可以并发多个线程,每条线程并行执行不同的任务。在Unix System V及SunOS中也被称为轻量进程(lightweight processes),但轻量进程更多指内核线程(kernel thread),而把用户线程(use转载 2014-03-18 20:34:08 · 4596 阅读 · 3 评论 -
线程同步--递归锁 非递归锁
一、简介1.1 进程/线程同步方法 常见的进程/线程同步方法有互斥锁(或称互斥量Mutex)、读写锁(rdlock)、条件变量(cond)、信号量(Semophore)等。 在windows系统中,临界区(Critical Section)和事件对象(Event)也是常用的同步方法。1.2 递归锁/非递归锁 Mutex可以分为递归锁(recursi原创 2014-03-19 22:09:29 · 4826 阅读 · 0 评论 -
多线程服务器的适用场合
正名与前文相同,本文的“进程”指的是 fork() 系统调用的产物。“线程”指的是 pthread_create() 的产物,而且我指的 pthreads 是 NPTL 的,每个线程由 clone() 产生,对应一个内核的 task_struct。本文所用的开发语言是 C++,运行环境为 Linux。首先,一个由多台机器组成的分布式系统必然是多进程的(字面意义上),因为进程不能跨 OS 边转载 2014-03-25 15:17:45 · 959 阅读 · 0 评论 -
一个多线程的死锁和锁争用的例子
在多线程编程中,为了保持同步,需要使用互斥锁保护临界区,但是多线程共同使用互斥锁的时候会造成死锁或者锁争用的情况:死锁:产生死锁的原因主要是:(1) 因为系统资源不足。(2) 进程运行推进的顺序不合适。(3) 资源分配不当等。如果系统资源充足,进程的资源请求都能够得到满足,死锁出现的可能性就很低,否则就会因争夺有限的资源而陷入死锁。其次,进程运行推进顺序与速度不同,也可原创 2014-03-25 09:14:29 · 6057 阅读 · 0 评论 -
【多线程】使用信号量进行同步
信号量是最早出现的用来解决进程同步与互斥问题的机制(也可实现进程通信),包括一个称为信号量的变量及对它进行的两个原语操作。信号量为一个整数,我们设这个信号量为:sem。很显然,我们规定在sem大于等于零的时候代表可供并发进程使用的资源实体数,sem小于零的时候,表示正在等待使用临界区的进程的个数。根据这个原则,在给信号量附初值的时候,我们显然就要设初值大于零。p操作和v操作是不可中断的程序段,原创 2013-11-03 22:24:26 · 3129 阅读 · 0 评论 -
linux下多线程和信号处理
linux信号种类1、可靠信号和不可靠信号 "不可靠信号" Linux信号机制基本上是从Unix系统中继承过来的。早期Unix系统中的信号机制比较简单和原始,后来在实践中暴露出一些问题,因此,把那些建立在 早期机制上的信号叫做"不可靠信号",信号值小于SIGRTMIN(Red hat 7.2中,SIGRTMIN=32,SIGRTMAX=63)的信号都是不可转载 2013-11-06 16:26:34 · 2736 阅读 · 0 评论 -
多线程多进程优先级理解--优先级反转
1. 优先级反转(Priority Inversion) 由于多进程共享资源,具有最高优先权的进程被低优先级进程阻塞,反而使具有中优先级的进程先于高优先级的进程执行,导致系统的崩溃。这就是所谓的优先级反转(Priority Inversion)。2. 产生原因 其实,优先级反转是在高优级(假设为A)的任务要访问一个被低优先级任务(假设为C)占有的资源时,被阻塞.而此原创 2013-11-05 09:26:17 · 4234 阅读 · 1 评论 -
《多线程服务器的适用场合》– 例释与答疑
《多线程服务器的适用场合》(以下简称《适用场合》)一文在博客登出之后,有热心读者提出质疑,我自己也觉得原文没有把道理说通说透,这篇文章试图用一些实例来解答读者的疑问。我本来打算修改原文,但是考虑到已经读过的读者不一定会注意到文章的变动,干脆另写一篇。为方便阅读,本文以问答体呈现。这篇文章可能会反复修改扩充,请注意上面的版本号。本文所说的“多线程服务器”的定义与前文一样,同时参见《多线程服务器的转载 2014-03-25 15:21:50 · 1255 阅读 · 0 评论 -
多线程与多进程的区别(4)
很想写点关于多进程和多线程的东西,我确实很爱他们。但是每每想动手写点关于他们的东西,却总是求全心理作祟,始终动不了手。今天终于下了决心,写点东西,以后可以再修修补补也无妨。 一.为何需要多进程(或者多线程),为何需要并发?这个问题或许本身都不是个问题。但是对于没有接触过多进程编程的朋友来说,他们确实无法感受到并发的魅力以及必要性。我想,只要你不是整天都写那种int main()转载 2013-10-07 22:35:59 · 1288 阅读 · 0 评论 -
多线程与多进程(5)
【概念上】 一 进程是具有一定独立功能的程序关于某个数据集合上的一次运行活动,是系统进行资源分配和调度的一个独立单位; 二 线程是进程的一个实体,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位.线程自己基本上不拥有系统资源,只拥有一点在运行中必不可少的资源(如程序计数器,一组寄存器和栈),一个线程可以创建和撤销另一个线程;【进程与线程区别与联系】转载 2013-10-07 22:37:57 · 1393 阅读 · 0 评论 -
谈谈互斥锁和条件变量的几种使用方法
#include #include #include // a superfluous check for pedantic peopleinline void CHECK_SUCCESS(int ret){if (ret != 0){abort();}} // Implementaion base for init-destroy mutex_ and cond_c转载 2014-10-30 22:19:13 · 1637 阅读 · 0 评论