自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(40)
  • 收藏
  • 关注

转载 12.9 线程与fork

当一个线程调用函数fork的时候,整个进程地址空间会被拷贝到子进程中,在8.3节中有提到copy-on-write.子进程是一个与父进程完全不同的进程,但是如果父进程和子进程都没有对内存内容进行修改,那么该内存页就可以在父进程与子进程之间进行共享。 通过继承父进程的整个地址空间,子进程也会继承父进程每个互斥锁,读写锁以及条件变量的状态,如果父进程包含了多个线程,而且在fork函...

2016-07-02 19:54:00 164

转载 12.8 线程和信号

在基于进程模型的信号处理已经比较吗麻烦了,引入线程后事情就更加复杂了。 每个线程拥有其自身的信号掩码,但是信号处理函数是被进程内的所有线程共享的,作为一个推论,独立的线程能够阻塞信号,但是如果一个线程修改与给定信号的处理动作的时候,所有的线程都会共享这一修改。也就是说,如果一个线程选择忽略一个给定信号,其他的线程可能会通过恢复默认呢处理或者是安装信号处理函数的方式撤销线程所做的...

2016-07-02 19:52:00 182

转载 12.7 Cancal选项

还有两个线程属性并没有包含在pthread_attr_t结构中,它们是cancelability state以及cancelability type。这两个属性影响了线程对于函数调用pthread_cancel的相应行为。(11.5节) cancelability state属性可以取值PTHREAD_CANCEL_ENABLE或者是PTHREAD_CANCEL_DISABLE...

2016-07-02 19:51:00 350

转载 12.8 线程和信号

在基于进程模型的信号处理已经比较吗麻烦了,引入线程后事情就更加复杂了。 每个线程拥有其自身的信号掩码,但是信号处理函数是被进程内的所有线程共享的,作为一个推论,独立的线程能够阻塞信号,但是如果一个线程修改与给定信号的处理动作的时候,所有的线程都会共享这一修改。也就是说,如果一个线程选择忽略一个给定信号,其他的线程可能会通过恢复默认呢处理或者是安装信号处理函数的方式撤销线程所做的...

2016-07-02 19:51:00 169

转载 12.6 线程私有数据

线程私有数据是一种用于存储和获取与特定线程相关联数据的机制,称为线程特定的或者是线程私有的,是因为我们希望每个线程都可以独立访问其独有的数据,而不用担心与其他线程的同步访问问题。 许多人费力实现了促进进程数据以及属性贡献的线程模型,那么为什么还有人想要实现一个接口,在这样一个模型中防止共享呢?有如下两点原因: 首先,有些时候我们需要以线程为基础维护一些数据,因为没有任何机制...

2016-07-02 19:49:00 160

转载 12.5 重入

我们在10.6节中讨论了可重入函数以及信号处理函数,线程与信号处理函数在重入方面是非常相似的。多线程的控制的本质也是同时调用相同的函数。 如果一个函数可以被多个线程同时安全地调用,我们称该函数为线程安全的(thread-safe).除了图12.9列出的函数之外,The Single Unix Specification定义的其他函数都是线程安全的,此外,ctermid以及...

2016-07-02 19:47:00 125

转载 12.4 同步属性

12.4.1 互斥锁属性ExampleExample12.4.2 读写锁属性12.4.3 条件变量属性12.4.4 Barrier属性12.4.1 互斥锁属性互斥锁属性使用结构pthread_mutexattr_t结构进行存储,在11章中,我们使用PTHREAD_MUTEX_INITIALIZER常量或者是调用函数pthread_mutex_init并传参NULL指...

2016-07-02 19:45:00 274

转载 12.2 线程限制

我们已经在2.5.4节中讨论了函数sysconf,The Single Unix Specification定义了与线程操作相关的几个限制。与其他系统限制一样,线程限制也可以使用函数sysconf进行查询,图12.1总结了这些限制. 与其他使用sysconf获取到的系统限制一样,这些限制的应用是为了促进应用程序在不同操作系统实现上的可移植性,比如说,如果你的应用程序需要你为你所...

2016-06-21 02:34:00 153

转载 12.3 线程属性

pthread接口允许我们通过设置与不同对象相关联的属性来微调线程以及同步对象的行为。通常来说,管理这些属性的函数符合如下模式:每一个对象都有与其相关联的属性对象类型(线程由线程属性,互斥锁由互斥锁属性,等等),一个属性对象可以表示多个属性。属性对象对于应用程序来说是不透明的,也就是说应用程序并支持获取属性对象内部结构,这能够促进应用程序的移植。取而代之的是,应用程序需...

2016-06-21 02:34:00 95

转载 12.1 线程控制简介

在11章中,我们已经学习了线程以及线程同步的基础知识。在本章中,我们将会学习控制线程行为的细节,我们将会看到线程属性,同步函数属性。这些概念在上一章中被默认行为代替了。 接下来还会介绍线程如何在同一进程内保存线程私有数据,然后将会以基于进程的系统调用对于线程的影响结束本章的学习。 来自为知笔记(Wiz)转载于:https://www.cnblogs.com/U20101...

2016-06-21 02:33:00 121

转载 11.6 线程同步

11.6.1 互斥Example11.6.2 避免死锁Example11.6.3 pthread_mutex_timedlock 函数Example11.6.4Reader-Writer LocksExample11.6.5 带有超时功能的读写锁11.6.6 条件变量Example11.6.7 自旋锁11.6.8 BarriersExample 当多个线程控制流需要共享内存的时...

2016-06-21 00:15:00 199

转载 11.5 线程终止

如果进程内任意线程调用了exit,_Exit或者是_exit,那么整个进程就会终止运行,类似地,当某信号的处理是终止进程的时候,该信号被发送到任一线程也将会终止整个进程(我们将在12.8节中更多地讨论信号与线程的交互)。 仅仅终止单个线程,而不是整个进程的方法有三种:线程可以简单地从线程启动函数内返回,返回值就是线程的退出码;线程可以被相同进程被的其他线程取消运...

2016-06-05 19:38:00 106

转载 11.4 线程创建

传统UNIX程序模型中每一个进程都只支持一个线程控制,在概念上,这与每个线程仅仅由一个线程组成的线程模型是一样的。采用pthreads以后,当一个程序运行的时候,系统也会启动一个单线程控制进程,当程序运行的时候,其行为与传统进程并没有什么明显区别,除非它创建了多线程控制,其他线程可以通过调用函数pthread_create来创建。#include <pthread.h...

2016-06-04 02:10:00 146

转载 11.3 线程ID

正如每一个进程都有一个进程ID一样,每一个线程都有一个线程ID.与进程ID在系统内是唯一的不同,线程ID仅仅在其所属进程的上下文中有意义。 进程ID是使用数据类型pid_t来进行表示的,该类型是一个非负整数。线程ID使用pthread_t进行存储,实现可以使用一个结构来进行存储,所以可移植程序不能将他们当做整数对待,因此,对于线程ID的比较需要使用专门的函数实现:#in...

2016-06-04 00:48:00 135

转载 11.2 线程概念

典型的UNIX程序被认为是单线程控制的:每一个进程在一个时刻仅仅做一件事;引入多线程以后,我们可以在单个进程内设计程序同时执行多个任务,该方法有如下几个好处:我们可以简化异步时间处理的程序的设计:对于每一种时间类型非配一个单独的线程,每一个线程都可以使用同步模型来处理事件,同步编程模型比异步编程模型更加简单。多进程要实现内存和文件描述符共享需要使用操作系统提供的复杂...

2016-06-03 08:16:00 92

转载 11.1 线程简介

我们已经中讨论了进程,我们学习了UNIX进程的环境,进程间的关系,控制进程的方法,进程间的关系;同时我们也看到进程间共享的资源时非常少的。 在本章中,我们将学习如何使用多线程控制来实现单个进程环境内执行多个线程,所有单个进程内的线程都有权限访问相同的进程组件,比如说文件描述符以及内存。 任何是否你只要在多个用户之间共享文件的话,你就必须处理好一致性。我们将在本章最后多线程处...

2016-06-02 00:50:00 104

转载 10.22 信号名称与编号

在本节中,我们将会讲述如何在信号编号与信号名称之间进行映射。一些系统提供了数组 extern char *sys_siglist[]; 其中数组索引就是信号编号,给出一个指向信号名称字符串的指针。 FreeBSD 8.0, Linux 3.2.0以及 Mac OS X 10.6.8都提供了这个信号名称的数组,Solaris 10也提供了,但是指针数组名称为_s...

2016-06-01 23:52:00 334

转载 10.21 作业控制信号

POSIX.1使用了六个信号来实现作业控制:SIGCHLD 子进程已经停止或者终止SIGCONT 已经停止的进程继续运行SIGSTOP 停止进程信号(不能捕获或者忽略)SIGTSTP 交互式停止信号SIGTTIN 后台进程组成员从控制终端读取SIGTTOU 后台进程组...

2016-06-01 22:50:00 152

转载 10.20 sigqueue函数

在10.8节中我们讲到许多UNIX系统并不支持信号的排队,随着POSIX.1增加了实时扩展,一些系统开始支持信号队列,在SUSv4中,信号队列功能已经从实时扩展中移到了基本规范中了。 通常来说,一个信号只能携带一个bit的信息:即是信号本身。除了排队的信号之外,这些扩展还允许应用程序在信号发送的同时传递更多的信息,这些信息被嵌入到了一个siginfo结构中,连同系统提供的信息一...

2016-05-30 00:08:00 201

转载 10.19 sleep,nanosleep以及clock_nanosleep函数

我们已经在本书中多次使用了函数sleep,我们也在图10.7以及图10.8中展示了两个有缺陷的sleep函数的实现。#include <unistd.h>unisgned int sleep(unsigned int seconds); Returns:0 or number of unslept seconds.该函数会造成进程挂起直到如下两个条...

2016-05-29 21:51:00 614

转载 10.18 system函数

在8.13节中,我们展示了一个system函数的实现,在哪一个版本中,我们并没有对信号做任何处理。POSIX.1要求system函数需要忽略SIGINT以及SIGQUIT信号,并且阻塞信号SIGCHLD.在展示一个正确处理这些信号的函数实现之前,让我们一起看一下为什么需要担心信号的处理。Example图10.26中显示的例子使用了8.13中的system函数调用了函...

2016-05-28 12:17:00 192

转载 10.17 abort函数

我们早些时候提到函数abort能够造成程序的非正常终止。#include <stdlib.h>void abort(void); This function never returns.该函数会发送一个信号SIGABRT到调用进程。(进程不应该忽略这一信号),ISO C指出调用函数abort将会通过调用函数raise(SIGABRT)向主机环境发送...

2016-05-26 07:29:00 288

转载 10.16 sigsuspend函数

我们已经学习了如何修改进程的信号掩码,实现指定信号的阻塞与接触阻塞。我们可以使用这一技术来保护临界区域的代码(当在这一段区域内执行代码的时候哦,我们不希望被信号中断),但是如果我们想要接触一个信号的阻塞,然后进入暂停状态,等待之前阻塞的信号的出现呢?假设指定的信号是SIGINT,可能会采用如下的方式来实现,但是确实错误的:sigset_t newmask,oldma...

2016-05-24 22:55:00 400

转载 10.15 sigstjmp以及siglongjmp函数

在7.10节中,我们讲述了setjmp以及longjmp函数,这两个函数用于远程跳转。其中longjmp函数进场在信号处理函数中被调用,用于返回到进程的主循环中去,而不是从信号处理函数中返回。 但是使用函数longjmp有一个问题,当一个信号被捕获的时候,信号处理函数被执行,当前信号将被自动增加到进程的信号掩码中去。这样做的目的是为了防止后续的信号中断当前信号处理函数的执行,如...

2016-05-22 23:36:00 182

转载 10.14 sigaction函数

函数sigaction允许我们获取或者是修改(或者获取并修改)与特定信号相关联的处理函数,该函数替代了早期的UNIX系统发布版中的函数signal,实际上,在本节末尾,我们将会使用sigaction来实现一个signal函数。#include <signal.h>int sigaction(int signo, const struct sigaction *r...

2016-05-22 23:35:00 346

转载 10.12 sigprocmask函数

在10.8节中我们提到进程的掩码是一个当前阻塞信号发送到进程的信号集合。一个进程可以查看其信号掩码,改变其信号掩码,或者同时执行这两个操作,通过调用函数sigprocmask来实现上述要求.#include <signal.h>int sigprocmask(int how, const sigset_t *restrict set, sigset_t *res...

2016-05-22 23:34:00 179

转载 10.13 sigpending函数

函数sigpending被阻塞发送并且当前被调用该函数的进程挂起的信号,这个信号集通过参数set返回.#include <signal.h>int sigpending(sigset_t *set); Returns:0 if OK,-1 on error.Example#include "apue.h"static void si...

2016-05-22 23:34:00 171

转载 10.11 信号集

我们需要使用一种数据类型来存储多个信号,这种类型称为信号集,我们将在函数sigprocmask等函数中使用这些数据结构(下一节中),用于告知内核不要允许集合中的信号出现,正如我们早些时候提到的,不同信号的数量可能会超过一个整形变量的Bit数量,所以通常来说,我们不能使用整形变量中的每一个Bit来存储每一个信号。POSIX.1定义了数据结构sigset_t用存储信号集,并且允许如下五...

2016-05-22 23:33:00 123

转载 10.10 alarm以及pause函数

alarm函数pause函数ExampleExampleExampleExamplealarm函数 alarm函数允许我们设置一个在未来的某一时刻终止的定时器,当定时器终止的时候,SIGALRM信号就被发出,如果我们忽略或者不捕获这一信号的话,该信号的默认行为是终止进程.#include <unistd.h>unsigned int alarm(u...

2016-05-22 23:33:00 225

转载 10.9 kill以及raise函数

kill函数用于发送信号给一个进程或者是一个进程组,函数raise允许进程发送一个信号给自身。 raise函数最开始定义与ISO C中,POSIX.1为了与兼容ISO C标准,于是包含了函数raise,但是POSIX.1将函数raise的特性扩展到了线程处理(我们将在12.8中讨论线程是如何与信号发生交互的),因为ISO C并不处理多进程,它并不能定义向kill这样的函数,...

2016-05-22 23:32:00 193

转载 10.7 SIGCHLD定义

经常混淆的两个信号就是SIGCLD以及SIGCHLD,信号SIGCLD源于System V,该信号的含义与源自BSD的信号SIGCHLD不一致。同时POSIX.1信号也称为SIGCHLD.源自BSD的信号SIGCHLD的语义比较正常,当该信号出现的时候,表示子进程的状态发生了变化,然后我们需要调用一个wait函数来查看究竟发生了什么。System V对于SIGCLD的处理历史以来...

2016-05-22 23:31:00 317

转载 10.8 可靠信号术语以及语义

我们需要定义一些术语来继续信号的讨论,首先,信号是在造成信号的事件出现的时候由进程产生或者被发送到进程的,该事件可能是硬件错误(比如说除零错误),软件条件(比如说alarm设置的时间达到),或者是终端信号,或者是kill函数的调用,当信号产生的时候,内核通常在进程表中设置一些标志。我们所说的”信号被发送到一个进程”是在进程准备执行信号处理函数的时候,在信号生成和被发送之间的时候,...

2016-05-22 23:31:00 139

转载 10.6 可重入函数

当一个信号捕获到并开始被进程处理的时候,进程正常执行的指令序列将被信号处理函数临时中断,进程立即转到信号处理函数中开始执行,如果信号处理函数返回(而不是调用exit或者是longjmp等),然后在进入信号处理函数之前进程正在执行的指令序列将会接着执行,但是在信号处理函数中,我们无法获知在信号被捕获的时候进程正在执行那一段代码,如果进程正在使用函数malloc在其堆上分配额外的内存的过程中...

2016-05-22 23:30:00 105

转载 10.5 Interrupted System Calls

早期UNIX系统的一个特点就是:当进程被阻塞再一个“slow”的系统调用中的时候如果捕获到一个信号,系统调用就会被中断,然后系统调用返回一个错误,其中errno被设置为EINTR.这可以实现使用一些事件的发生来唤醒被阻塞的系统调用。 为了支持这一特性,系统调用被分为两类:slow的系统调用,以及其他系统调用,所谓的slow系统调用是指可能永远阻塞的系统调用,包括如下系统调用:...

2016-05-22 23:29:00 265

转载 10.4 不可靠信号

在早期版本的UNIX系统中(比如说版本7),信号是不可靠的,意思是说信号可能丢失:一个信号出现,但是进程可能永远也不知道它,Aslo,a process had little conrol over a signal: a process could catch the signal or ignore it, 有时候,我们希望告知内核阻塞一个信号:不要忽略它,当信号出现的时候记住,然后...

2016-05-22 23:28:00 151

转载 10.3 signal函数

UNIX系统的信号特性的最简单的接口就是signal函数:#include <signal.h>void (*signal(int signo, void(* func)(int)))(int); Returns:previous disposition of signal(see following)if OK,SIG_ERR on error. ...

2016-05-22 23:26:00 136

转载 10.1 简介

信号是软件中断。许多重要的应用程序都需要处理信号,信号提供了一种异步事件处理的方法—举例来说,一个用户在终端上键入中断按键或者是pipeline中下一个程序提前终止。信号在早期UNIX系统中就已经有提供了,但是系统中的信号模型并不可靠,信号可能丢失,当程序中执行一段关键区域的代码的时候,很难去关闭指定的信号。BSD4.3以及SVR3都对信号模型进行了修改,增加了称为可靠信号rel...

2016-05-22 23:25:00 118

转载 10.2信号的概念

首先,每一个信号都有一个名字,这些名字都是使用相同的三个字母SIG 开始的。举例来说,SIGABRT是当进程调用数abort的时候生成的终止信号。SIGALRM是当函数alaram设置的定时时间到的时候生成的alarm信号。版本7已经有了15中信号;SVR4以及4.4BSD有31种不同的信号,FreBSD 8.0支持32中不同的信号:Mac OS X10.6.8以及Linux3.2.0各...

2016-05-22 23:25:00 122

转载 避免内存错误(C++)

内存管理上的错误是C/C++程序设计是最为可怕的错误之一,这类错误不易调试查找,有时候是你程序关闭的时候才出现,如果你面对的是一个大型工程,那就相当令人头疼了,下面将该类错误出现的原因总结为如下四点:内存泄露顾名思义,内存泄露是指分配了一段内存之后,没有将其释放所致,这块没有释放而又没用的内存会随同程序运行一直存在。如果程序一味地分配内存而不予回收,可以想象,系统资源会很快耗尽,...

2013-04-20 19:19:00 226

转载 线程函数访问类成员的方法

首先谈到在C++中创建线程的方法,CSDN 2010版介绍如下:HANDLE WINAPI CreateThread(_In_opt_LPSECURITY_ATTRIBUTES lpThreadAttributes,//安全属性,一般设置为NULL即可_In_SIZE_T dwStackSize,//一般设置...

2013-04-17 22:46:00 265

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除