Linux进程与线程
文章平均质量分 78
a1232345
这个作者很懒,什么都没留下…
展开
-
线程间的通信
1.线程之间的通信简介一般而言,在一个应用程序中(即进程),一个线程往往不是孤立存在的,常常需要和其它线程通信,以执行特定的任务。如主线程和次线程,次线程与次线程,工作线程和用户界面线程等。这样,线程与线程间必定有一个信息传递的渠道。这种线程间的通信不但是难以避免的,而且在多线程编程中也是复杂和频繁的。线程间的通信涉及到4个问题:(1) 线程间如何传递信息(2) 线程之间转载 2014-12-24 15:18:07 · 575 阅读 · 0 评论 -
POSIX 线程详解(一)
线程是有趣的了解如何正确运用线程是每一个优秀程序员必备的素质。线程类似于进程。如同进程,线程由内核按时间分片进行管理。在单处理器系统中,内核使用时间分片来模拟线程的并发执行,这种方式和进程的相同。而在多处理器系统中,如同多个进程,线程实际上一样可以并发执行。那么为什么对于大多数合作性任务,多线程比多个独立的进程更优越呢?这是因为,线程共享相同的内存空间。不同的线程可以存取内存中的同转载 2014-11-20 13:27:17 · 598 阅读 · 0 评论 -
POSIX 线程详解(三)
使用条件变量提高效率本文是 POSIX 线程三部曲系列的最后一部分,Daniel 将详细讨论如何使用条件变量。条件变量是 POSIX 线程结构,可以让您在遇到某些条件时“唤醒”线程。可以将它们看作是一种线程安全的信号发送。Daniel 使用目前您所学到的知识实现了一个多线程工作组应用程序,本文将围绕着这一示例而进行讨论。2 评论:Daniel Rob转载 2015-01-27 12:48:26 · 725 阅读 · 1 评论 -
pthread_cond_wait()函数
LINUX环境下多线程编程肯定会遇到需要条件变量的情况,此时必然要使用pthread_cond_wait()函数。但这个函数的执行过程比较难于理解。 pthread_cond_wait()的工作流程如下(以MAN中的EXAMPLE为例): Consider two shared variables x and y, protected by the mutex mut, an转载 2015-01-27 10:34:41 · 638 阅读 · 0 评论 -
linux多线程编程,你还在用sleep么?用pthread_cond_timedwait吧
摘要:多线程编程中,线程A循环计算,然后sleep一会接着计算(目的是减少CPU利用率);存在的问题是,如果要关闭程序,通常选择join线程A等待线程A退出,可是我们必须等到sleep函数返回,该线程A才能正常退出,这无疑减慢了程序退出的速度。当然,你可以terminate线程A,但这样做很不优雅,且会存在一些未知问题。采用pthread_cond_timedwait(pthread_cond_t转载 2015-01-27 10:01:59 · 3918 阅读 · 0 评论 -
线程的分离状态 pthread_attr_setdetachstate 函数使用
在任何一个时间点上,线程是可结合的(joinable),或者是分离的(detached)。一个可结合的线程能够被其他线程收回其资源和杀死;在被其他线程回收之前,它的存储器资源(如栈)是不释放的。相反,一个分离的线程是不能被其他线程回收或杀死的,它的存储器资源在它终止时由系统自动释放。 线程的分离状态决定一个线程以什么样的方式来终止自己。在默认情况下线程是非分离状态的,这种情况转载 2014-11-19 18:12:59 · 866 阅读 · 0 评论 -
基于条件变量阻塞pthread_cond_wait
基于条件变量阻塞使用 pthread_cond_wait(3C) 可以以原子方式释放 mp 所指向的互斥锁,并导致调用线程基于 cv 所指向的条件变量阻塞。对于 Solaris 线程,请参见cond_wait 语法。pthread_cond_wait 语法int pthread_cond_wait(pthread_cond_t *cv,pthread_mutex_t转载 2015-01-27 14:41:03 · 1372 阅读 · 0 评论 -
pthread_join介绍
pthread_join编辑函数pthread_join用来等待一个线程的结束。头文件 : #include 函数定义: int pthread_join(pthread_t thread, void **retval);描述 :pthread_join()函数,以阻塞的方式等待thread指定的线程结束。当函数返回时,被等待线程的资源被收回。如果进程已经结束,转载 2014-12-23 18:55:07 · 954 阅读 · 0 评论 -
pthread_join函数
pthread_join使一个线程等待另一个线程结束。 代码中如果没有pthread_join主线程会很快结束从而使整个进程结束,从而使创建的线程没有机会开始执行就结束了。加入pthread_join后,主线程会一直等待直到等待的线程结束自己才结束,使创建的线程有机会执行。 所有线程都有一个线程号,也就是Thread ID。其类型为pthread_t。通过调用pthread_sel转载 2014-11-19 17:34:48 · 710 阅读 · 0 评论 -
Linux多线程同步之互斥量和条件变量
1. 什么是互斥量 互斥量从本质上说是一把锁,在访问共享资源前对互斥量进行加锁,在访问完成后释放互斥量上的锁。对互斥量进行加锁以后,任何其他试图再次对互斥量加锁的线程将会被阻塞直到当前线程释放该互斥锁。如果释放互斥锁时有多个线程阻塞,所以在该互斥锁上的阻塞线程都会变成可进行状态,第一个变成运行状态的线程可以对互斥量加锁,其他线程在次被阻塞,等待下次运行状态。pthr原创 2016-03-30 23:30:50 · 1187 阅读 · 0 评论 -
使用互斥量控制Linux线程同步
一、什么是互斥量互斥量是另一种用于多线程中的同步访问方法,它允许程序锁住某个对象,使得每次只能有一个线程访问它。为了控制对关键代码的访问,必须在进入这段代码之前锁住一个互斥量,然后在完成操作之后解锁。二、互斥量的函数的使用它们的定义与使用信号量的函数非常相似,它们的定义如下:[cpp] view plain c转载 2016-03-30 14:01:56 · 602 阅读 · 0 评论 -
使用信号量控制Linux线程同步
linux中两种基本的同步方法是信号量和互斥量。这两种方法很相似,而且它们可以相互通过对方来实现。信号量概述下面介绍用信号量进行同步。信号量概念由荷兰科学家Dijkstra首先提出。信号量是一个特殊类型的变量,它可以被增加或者减少。但对其的关键访问被保证是原子操作,即使在一个多线程程序中也是如此。信号量有两种类型:原创 2016-03-29 13:38:17 · 857 阅读 · 0 评论 -
Linux多线程同步之读写锁
读写锁和互斥量(互斥锁)很类似,是另一种线程同步机制,但不属于POSIX标准,可以用来同步同一进程中的各个线程。当然如果一个读写锁存放在多个进程共享的某个内存区中,那么还可以用来进行进程间的同步,和互斥量不同的是:互斥量会把试图进入已保护的临界区的线程都阻塞;然而读写锁会视当前进入临界区的线程和请求进入临界区的线程的属性来判断是否允许线程进入。相对互斥量只有加锁和不加锁两种状态,读原创 2016-03-31 14:24:40 · 2060 阅读 · 1 评论 -
waitpid非阻塞时的用法
我们用这个程序和输出结果分析一下waitpid的用法和特点。我们将waitpid设置成WNOHANG非阻塞父进程状态;#include #include #include #include #include int main(void){ pid_t pid, wpid; int stat; wpid = waitpid(-1, &stat, WNOHANG); pri原创 2016-02-29 23:26:58 · 4206 阅读 · 0 评论 -
Linux多线程中使用信号-1
在Linux的多线程中使用信号机制,与在进程中使用信号机制有着根本的区别,可以说是完全不同。在进程环境中,对信号的处理是,先注册信号处理函数,当信号异步发生时,调用处理函数来处理信号。它完全是异步的(我们完全不知到信号会在进程的那个执行点到来!)。然而信号处理函数的实现,有着许多的限制;比如有一些函数不能在信号处理函数中调用;再比如一些函数read、recv等调用时会被异步的信号给中断(inter转载 2016-04-12 17:58:49 · 746 阅读 · 0 评论 -
Linux 多线程应用中如何编写安全的信号处理函数
关于代码的可重入性,设计开发人员一般只考虑到线程安全,异步信号处理函数的安全却往往被忽略。本文首先介绍如何编写安全的异步信号处理函数;然后举例说明在多线程应用中如何构建模型让异步信号在指定的线程中以同步的方式处理。0 评论周 婷 (zhouting@cn.ibm.com), 软件工程师, IBM 中国软件开发技术实验室刘 坚 (liujsh@cn.ibm转载 2016-04-13 16:26:01 · 954 阅读 · 0 评论 -
linux线程简介之pthread
Linux系统下的多线程遵循POSIX线程接口,称为pthread。编写Linux下的多线程程序,需要使用头文件pthread.h,连接时需要使用库libpthread.a。顺便说一下,Linux下pthread的实现是通过系统调用clone()来实现的。clone()是Linux所特有的系统调用,它的使用方式类似fork,关于clone()的详细情况,有兴趣的读者可以去查看有关文档说明。下面我们转载 2014-09-16 23:00:28 · 705 阅读 · 0 评论 -
主线程和子线程总结
运行结果 从上面可以看到:【1】如果主线程和子线程是并行的,虽然都是用while(1)但是倚靠CPU的调度,主线程和子线程都有机会得到执行。【2】如果要在子线程里面改变主线程里面的数据,就在pthread_create里面的最后 一个参数使用传地址调用(void *)&c,否则使用传值调用(void *)c转载 2014-12-24 16:40:26 · 1775 阅读 · 0 评论 -
Linux进程间通信(一)管道
一个进程在管道的尾部写入数据,另一个进程从管道的头部读出数据。管道包括无名管道和有名管道两种,前者只能用于父进程和子进程间的通信,后者可用于运行于同一系统中的任意两个进程间的通信。管道通信-特点#include #include #include #include #include int main(int argc, char *argv[]){ pid_t pi原创 2016-01-31 14:25:30 · 649 阅读 · 0 评论 -
消息队列函数(msgget、msgctl、msgsnd、msgrcv)及其范例
消息队列函数由msgget、msgctl、msgsnd、msgrcv四个函数组成。下面的表格列出了这四个函数的函数原型及其具体说明。1. msgget函数原型msgget(得到消息队列标识符或创建一个消息队列对象)所需头文件#include #include #include 函数说明得到消转载 2014-12-25 10:11:50 · 609 阅读 · 0 评论 -
深入浅出---unix多进程编程之wait()和waitpid()函数
Wait和waipid函数 当一个进程正常或异常终止的时候,内核就像其父进程发送SIGCHLD信号,因为子进程是个一步事件,所以这种信号也是内核系那个父进程发的异步通知。父进程可以选择忽略该信号,或者提供一个该信号发生时即被调用执行的函数。对于这种信号的系统默认动作是忽略它。现在要知道调用wait或waitpid的进程可能会发生什么情况: 如果其所有子进程转载 2015-03-05 15:44:11 · 439 阅读 · 0 评论 -
system/WIFEXITED/WEXITSTATUS函数-linux
system:感性认识:systerm两层含义:1、正确退出后。还需要再判断,操作成功或者操作失败。2、错误退出。[cpp] view plaincopy#include #include #include #include int转载 2015-03-05 15:48:04 · 1657 阅读 · 0 评论 -
linux进程知识 程序存储、crontab、fork与vfork、exec、_exit()、wait()与waitpid()、孤儿和僵尸
一、程序存储 经常被问到进程与线程的区别,今天有人问程序与进程的区别,一下子还真没反应过来 。程序只是一组指令的有序集合,它本身没有任何运行的含义,它只是一个静态的实体。而进程则不同,它是程序在某个数据集上的执行。进程是一个动态的实体,它有自己的生命周期。反映了一个程序在一定的数据集上运行的全部动态过程。 二、crontab转载 2015-03-05 16:25:17 · 1001 阅读 · 0 评论 -
fork与vfork、exec与system
比较fork与vfork之间的区别:都为创建一个子进程,1、前者是将父进程的内存数据copy到子进程中,而后者则是共用父进程的内存数据2、vfork:创建过子进程之后,阻塞父进程,当子进程调用exit()或者exec()后父进程开始往下运行。。注:vfork返回只能调用exit而不能使用return,,因为子进程与父进程共享一片内存,子进程return之后,释放局部变量、弹转载 2015-03-05 16:18:45 · 710 阅读 · 0 评论 -
Linux启动新进程的几种方法及比较
有时候,我们需要在自己的程序(进程)中启动另一个程序(进程)来帮助我们完成一些工作,那么我们需要怎么才能在自己的进程中启动其他的进程呢?在Linux中提供了不少的方法来实现这一点,下面就来介绍一个这些方法及它们之间的区别。一、system函数调用system函数的原型为:[cpp] view plaincopyprint?转载 2015-07-13 18:22:28 · 562 阅读 · 0 评论 -
Linux进程间通信——使用信号
一、什么是信号用过Windows的我们都知道,当我们无法正常结束一个程序时,可以用任务管理器强制结束这个进程,但这其实是怎么实现的呢?同样的功能在Linux上是通过生成信号和捕获信号来实现的,运行中的进程捕获到这个信号然后作出一定的操作并最终被终止。信号是UNIX和Linux系统响应某些条件而产生的一个事件,接收到该信号的进程会相应地采取一些行动。通常信号是由一个错误产转载 2015-07-13 17:58:18 · 512 阅读 · 0 评论 -
《APUE》读书笔记—进程控制
本章介绍Unix的进程控制,包括进程创建,执行程序和进程终止,进程的属性,exec函数系列,system函数,进程会计机制。1、进程标识符 每一个进程都有一个非负整数标识的唯一进程ID。ID为0表示调度进程,即交换进程,是内核的一部分,也称为系统进程,不执行任何磁盘操作。ID为1的进程为init进程,init进程不会终止,他是一个普通的用户进程,需要超级用户特权运行。获取标识符函数如下:转载 2015-09-07 20:27:27 · 470 阅读 · 0 评论 -
linux中fork()函数详解(实例讲解)
原帖地址:http://blog.csdn.net/jason314/article/details/5640969 一、fork入门知识 一个进程,包括代码、数据和分配给进程的资源。fork()函数通过系统调用创建一个与原来进程几乎完全相同的进程,也就是两个进程可以做完全相同的事,但如果初始参数或者传入的变量不同,两个进程也可以做不同的事。 一个进程调用fo转载 2015-09-06 23:55:18 · 424 阅读 · 0 评论 -
fork函数总结
在Unix/Linux中用fork函数创建一个新的进程。进程是由当前已有进程调用fork函数创建,分叉的进程叫子进程,创建者叫父进程。该函数的特点是调用一次,返回两次,一次是在父进程,一次是在子进程。两次返回的区别是子进程的返回值为0,父进程的返回值是新子进程的ID。子进程与父进程继续并发运行。如果父进程继续创建更多的子进程,子进程之间是兄弟关系,同样子进程也可以创建自己的子进程,这样可以建立起定转载 2015-09-06 17:39:24 · 692 阅读 · 0 评论 -
从一道面试题谈linux下fork的运行机制
今天一位朋友去一个不错的外企面试linux开发职位,面试官出了一个如下的题目: 给出如下C程序,在linux下使用gcc编译:1234567891011121314#include "stdio.h"#include "sys/types.h"#include "unistd.转载 2015-09-06 18:03:13 · 421 阅读 · 0 评论 -
系统调用跟我学之wait, waitpid函数
1.7 背景在前面的文章中,我们已经了解了父进程和子进程的概念,并已经掌握了系统调用exit的用法,但可能很少有人意识到,在一个进程调用了exit之后,该进程并非马上就消失掉,而是留下一个称为僵尸进程(Zombie)的数据结构。在Linux进程的5种状态中,僵尸进程是非常特殊的一种,它已经放弃了几乎所有内存空间,没有任何可执行代码,也不能被调度,仅仅在进程列表中保留一个位置,记载该进程的退转载 2015-09-14 23:45:01 · 698 阅读 · 2 评论 -
sync、fsync、fdatasync三个函数以及O_SYNC标志位的区别
在大多数的unix/linux对磁盘io的写操作都是通过缓存来完成的,基本的原理如下:当将数据写入文件时,内核通常先将该数据复制到其中一个缓冲区中,如果该缓冲区尚未写满,则并不将其排入输出队列,而是等待其写满或者当内核需要重用该缓冲区以便存放其他磁盘块数据时,再将该缓冲排入输出队列,然后待其到达队首时,才进行实际的I/O操作。 我们称之为延迟写,极大的减少了写磁盘的次数。但是在没写特殊的应转载 2016-01-19 19:43:30 · 1200 阅读 · 0 评论 -
僵尸进程的产生和避免
僵尸进程的产生:当一个进程创建了一个子进程时,他们的运行时异步的。即父进程无法预知子进程会在什么时候结束,那么如果父进程很繁忙来不及wait 子进程时,那么当子进程结束时,会不会丢失子进程的结束时的状态信息呢?处于这种考虑unix提供了一种机制可以保证只要父进程想知道子进程结束时的信息,它就可以得到。这种机制是:在每个进程退出的时候,内核释放该进程所有的资源,包括打开的文件,占用的原创 2016-03-01 00:22:10 · 1265 阅读 · 0 评论 -
Linux进程间通信(二)FIFO
1.从FIFO中读取数据:约定:如果一个进程为了从FIFO中读取数据而阻塞打开了FIFO,那么称该进程内的读操作为设置了阻塞标志的读操作。(1)如果有进程写打开FIFO,且当前FIFO为空,则对于设置了阻塞标志的读操作来说,将一直阻塞下去,直到有数据可以读时才继续执行;对于没有设置阻塞标志的读操作来说,则返回0个字节,当前errno值为EAGAIN,提醒以后再试。(2)对于设置了阻塞标原创 2016-01-30 17:22:53 · 1045 阅读 · 0 评论 -
vfork 挂掉的一个问题
在知乎上,有个人问了这样的一个问题——为什么vfork的子进程里用return,整个程序会挂掉,而且exit()不会?并给出了如下的代码,下面的代码一运行就挂掉了,但如果把子进程的return改成exit(0)就没事。我受邀后本来不想回答这个问题的,因为这个问题明显就是RTFM的事,后来,发现这个问题放在那里好长时间,而挂在下面的几个答案又跑偏得比较严重,我觉得可能有些朋友看到那样的答案会被误转载 2016-05-22 20:12:43 · 1128 阅读 · 0 评论