上一页 1 ··· 303 304 305 306 307 308 309 310 311 ··· 329 下一页
摘要: 使用互斥同步在多线程程序中同步访问的另一个方法就是使用互斥,其作用允许程序锁住一个对象,从而只有一个线程可以访问他。要控制对临界区代码的访问,在我们进入这段代码之前锁住一个互斥量,并且在我们完成操作时进行解锁。使用互斥所需要基本函数与信号量所需要的函数相似,其声明如下:#include <pthread.h>int pthread_mutex_init(pthread_mutex_t *mutex, const pthread_mutexattr_t*mutexattr);int pthread_mutex_lock(pthread_mutex_t *mutex);int pthr 阅读全文
posted @ 2009-07-19 15:06 jlins 阅读(170) 评论(0) 推荐(0) 编辑
摘要: 并发执行下面我们将要编写一个检测两个线程是否并发执行的程序。因为我们还没有了解要有效完成这一任务所需要的线程同步的知识,所以这并不是一个高效完成在线程之间称之为池操作的程序。再一起说明,我们要利用这一事实,在一个进程内部的不同线程之间共享除了局部函数变量之外的所有变量。试验--两个线程的同步执行在这一部分,我们所创建的程序thread2.c,是对thread1.c进行了简单的修改而得来的。我们添加一个额外的文件域变量来测试哪一个线程正在运行:int run_now = 1;当主函数执行时我们将其设置为1,而当我们的新线程执行时我们将其设置为2。在main函数时,在新线程创建之后,我们添加下面的 阅读全文
posted @ 2009-07-08 18:21 jlins 阅读(209) 评论(0) 推荐(0) 编辑
摘要: 第一个线程程序有一个完整的与线程相关的库调用集合,其中的大多数名字以pthread_开头。要使用这些库调用,我们必须定义宏_REENTRANT,包含文件pthread.h,并且使用-lpthread来链接线程库。当设计原始的Unix与POSIX库函数时,假定在任何进程中只有一个执行线程。一个明显的例子就是errno,这个变量用于在调用失败之后获取错误信息。在一个多线程程序中,默认情况下只有一个在线程之间共享的变量。一个线程中的调用可以很容易在另一个线程获取前一个错误代码之前更新这个变量。相似的程序也存在于函数中,例如fputs,通常使用一个全局区域用于缓存输出。我们需要被称之为可重入的例程。重 阅读全文
posted @ 2009-07-05 10:32 jlins 阅读(213) 评论(0) 推荐(0) 编辑
摘要: 第12章 POSIX线程在第11章,我们看到在Linux中进程是如何被处理的。这些多进程的特性很久以来就是类Unix操作系统的特性。有时使用fork创建一个新进程的代价实在是太大了。在这种情况下,使得一个程序同时做两件事情,或者至少看起来是如此是十分有用的。相对应的,我们也许希望以同样的方式同时发生两个或是更多的事情。这就是线程开始的地方。在这一章,我们将会了解:在一个进程内创建一个线程在一个进程的多个线程之间同步数据修改一个线程的属性在同一个进程中由一个线程控制另一个什么是线程一个程序内的多个执行线路被称之为线程。更为精确的定义是线程是一个进程内的控制队列。到目前为止我们所看到的所有程序都是 阅读全文
posted @ 2009-06-21 20:46 jlins 阅读(163) 评论(0) 推荐(0) 编辑
摘要: 健壮的信号接口我们已经讨论了使用signal来发出与捕获信号,因为他们在较为旧的Unix程序中很常见。然而,X/Open与Unix规范推荐了一个更为健壮的用于信号处理的新的编程接口:sigaction。#include <signal.h>int sigaction(int sig, const struct sigaction *act, struct sigaction *oact);sigaction结构定义在signal.h中,这个结构用于定义依据由sig所指定的信号而所要采取的动作,而且这个结构至少有以下几个成员:void (*) (int) sa_handler /* 阅读全文
posted @ 2009-06-13 10:45 jlins 阅读(176) 评论(0) 推荐(0) 编辑
摘要: 线程Linux进程可以协作,可以发送消息,也可以中断另一个进程。他们甚至可以在彼此之间共享内存段,但是在操作系统内部他们却是完全不同的实体。他们并不能共享变量。在许多Unix系统与Linux系统还有另一类名为线程的进程。线程在某些程序中具有巨大的价值,例如多线程数据库服务器,然而线程很难进行编程。Linux上的线程编程并不如使用多进程那样常见,因为Linux的进程是轻量级的,而且多个协作进程的编程要比线程编程容易得多。我们会在第12章讨论线程。信号信号是由Unix与Linux系统响应某些条件,依据哪一个进程按顺序执行某些动作而产生的事件。我们使用术语"raise"来表示一个 阅读全文
posted @ 2009-06-10 18:38 jlins 阅读(207) 评论(0) 推荐(0) 编辑
摘要: 等待一个进程当我们使用fork启动一个子进程时,他具有其自己的生命周期并且独立运行。有时,我们希望知道一个子进程何时结束。例如,在前一个例子中,父进程在子进程之前结束,从而我们得到混乱的输出,因为子进程还在继续运行。我们可以通过调用wait来使得父进程在继续运行之前等待,直到子进程结束。#include <sys/types.h>#include <sys/wait.h>pid_t wait(int *stat_loc);wait系统调用暂停父进程,直到他的一个子进程结束。这个函数调用返回其子进程的PID。这通常是一个已经结束的子进程。状态信息使得父进程可以确定子进程的 阅读全文
posted @ 2009-06-08 18:49 jlins 阅读(137) 评论(0) 推荐(0) 编辑
摘要: 进程调度ps输出的一个特点就是ps命令实体本身:1357 pts/2 R 0:00 ps -ax这表明进程1357处于运行状态(R)并且正在执行命令ps -ax。所以进程是在其自身的输出中被描述的。状态指示器只是表明程序已经准备好运行,并不一定是在实际运行。在单处理器的计算机上,每次只能运行一个进程,而其他的进程必须依次等待。这些轮序,就是所谓的时间片,非常短,从而给我们一种感觉,所有的程序是在同时运行的。状态R只是表示程序并没有等待其他的进程完成或是等待输入或输出来结束。这就是为什么我们会在ps输出中看到两个这样的进程。(另一个通常会看到的标识为运行的进程就是X显示服务器)Linux内核使用 阅读全文
posted @ 2009-06-07 12:21 jlins 阅读(214) 评论(0) 推荐(0) 编辑
摘要: 第11章 进程与信号进程与信号构成了Linux操作环境的基础部分。他们控制了几乎所有由Linux与其他的类Unix计算机系统所执行的活动。理解Linux与Unix如何管理进程将会使得系统程序员,程序编写者,或是系统管理处于一个有利的位置。在这一章,我们将会了解在Linux环境中进程中如何被处理的以及如何确定在指定的时刻计算机正在做什么。我们同时也会了解如何在我们自己的程序中启动与停止其他的进程,如何使得进程发送与接收消息,以及如何避免僵尸进程。具体而言,我们将会了解下列内容:进程结构,类型与调度使用不同的方法启动一个新进程父进程,子进程以及僵尸进程什么是信号以及如何使用信号什么是进程Unix规 阅读全文
posted @ 2009-05-24 18:02 jlins 阅读(232) 评论(0) 推荐(0) 编辑
摘要: 了解更多有关gdb的内容GNU调试器是一个强大的工具,可以提供大量的有关运行程序内部状态的信息。在支持一个名叫硬件断点(hardware breakpoint)的实用程序的系统上,我们可以使用gdb来实时的查看变量的改变。硬件断点是某些CPU的一个特性;如果出现特定的条件,通常是在指定区域的内存访问,这些处理器能够自动停止。相对应的,gdb可以使用watch表达式。这就意味着,出于性能考虑,当一个表达式具有一个特定的值时,gdb可以停止这个程序,而不论计算发生在程序中的哪个位置。断点可以使用计数以及条件进行设置,从而他们只在一定的次数之后或是当满足一个条件时才会被引发。gdb也能够将其本身附在 阅读全文
posted @ 2009-05-11 22:51 jlins 阅读(285) 评论(0) 推荐(0) 编辑
上一页 1 ··· 303 304 305 306 307 308 309 310 311 ··· 329 下一页