摘要:
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 当多个线程控制流需要共享内存的时候,我们需要确... 阅读全文
摘要:
如果进程内任意线程调用了exit,_Exit或者是_exit,那么整个进程就会终止运行,类似地,当某信号的处理是终止进程的时候,该信号被发送到任一线程也将会终止整个进程(我们将在12.8节中更多地讨论信号与线程的交互)。 仅仅终止单个线程,而不是整个进程的方法有三种: 线程可以简单地从线程启动函数内返回,返回值就是线程的退出码; 线程可以被相同进程被的其他线程取消运行; 线程可以调用函数... 阅读全文
摘要:
传统UNIX程序模型中每一个进程都只支持一个线程控制,在概念上,这与每个线程仅仅由一个线程组成的线程模型是一样的。采用pthreads以后,当一个程序运行的时候,系统也会启动一个单线程控制进程,当程序运行的时候,其行为与传统进程并没有什么明显区别,除非它创建了多线程控制,其他线程可以通过调用函数pthread_create来创建。 #include int pthread_create(pt... 阅读全文
摘要:
正如每一个进程都有一个进程ID一样,每一个线程都有一个线程ID.与进程ID在系统内是唯一的不同,线程ID仅仅在其所属进程的上下文中有意义。 进程ID是使用数据类型pid_t来进行表示的,该类型是一个非负整数。线程ID使用pthread_t进行存储,实现可以使用一个结构来进行存储,所以可移植程序不能将他们当做整数对待,因此,对于线程ID的比较需要使用专门的函数实现: #include int... 阅读全文
摘要:
典型的UNIX程序被认为是单线程控制的:每一个进程在一个时刻仅仅做一件事;引入多线程以后,我们可以在单个进程内设计程序同时执行多个任务,该方法有如下几个好处: 我们可以简化异步时间处理的程序的设计:对于每一种时间类型非配一个单独的线程,每一个线程都可以使用同步模型来处理事件,同步编程模型比异步编程模型更加简单。 多进程要实现内存和文件描述符共享需要使用操作系统提供的复杂机制,这一点将在第1... 阅读全文
摘要:
我们已经中讨论了进程,我们学习了UNIX进程的环境,进程间的关系,控制进程的方法,进程间的关系;同时我们也看到进程间共享的资源时非常少的。 在本章中,我们将学习如何使用多线程控制来实现单个进程环境内执行多个线程,所有单个进程内的线程都有权限访问相同的进程组件,比如说文件描述符以及内存。 任何是否你只要在多个用户之间共享文件的话,你就必须处理好一致性。我们将在本章最后多线程处理它们之间共享资... 阅读全文
摘要:
在本节中,我们将会讲述如何在信号编号与信号名称之间进行映射。一些系统提供了数组 extern char *sys_siglist[]; 其中数组索引就是信号编号,给出一个指向信号名称字符串的指针。 FreeBSD 8.0, Linux 3.2.0以及 Mac OS X 10.6.8都提供了这个信号名称的数组,Solaris 10也提供了,但是指针数组名称为_sys_siglist.... 阅读全文
摘要:
POSIX.1使用了六个信号来实现作业控制: SIGCHLD 子进程已经停止或者终止 SIGCONT 已经停止的进程继续运行 SIGSTOP 停止进程信号(不能捕获或者忽略) SIGTSTP 交互式停止信号 SIGTTIN 后台进程组成员从控制终端读取 SIGTTOU 后台进程组成员向控制终端写出 除了信... 阅读全文
摘要:
在10.8节中我们讲到许多UNIX系统并不支持信号的排队,随着POSIX.1增加了实时扩展,一些系统开始支持信号队列,在SUSv4中,信号队列功能已经从实时扩展中移到了基本规范中了。 通常来说,一个信号只能携带一个bit的信息:即是信号本身。除了排队的信号之外,这些扩展还允许应用程序在信号发送的同时传递更多的信息,这些信息被嵌入到了一个siginfo结构中,连同系统提供的信息一起,应用程序可... 阅读全文
摘要:
我们已经在本书中多次使用了函数sleep,我们也在图10.7以及图10.8中展示了两个有缺陷的sleep函数的实现。 #include unisgned int sleep(unsigned int seconds); Returns:0 or number of unslept seconds. 该函数会造成进程挂起直到如下两个条件中至少一个为止: seconds指定的系统时间... 阅读全文