线程库为程序员提供了创建和管理线程的API。

实现线程库的主要方式有两种:

  • 第一个方法是完全在没有内核支持的用户空间中提供一个库。库中的所有代码和数据结构都存在于用户空间中。这意味着调用库中的函数,通常会导致用户空间中的局部函数调用,而不是系统调用。
  • 第二种方法是实现由操作系统直接支持的内核级库。在这种情况下,库的代码和数据结构存在于内核空间中。调用库的API中的函数,通常会导致对内核的系统调用。

现在有三个主要的线程库

  1. POSIX的Pthreads:Pthreads,是POSIX标准的线程扩展,可以提供用来作为用户级或内核级库。
  2. Windows:Windows线程库是Windows系统上可用的内核级库。
  3. Java:Java线程API允许在Java程序中直接创建和管理线程。然而,因为在大多数情况下,JVM在主机操作系统之上运行,Java线程API通常使用宿主系统上可用的线程库实现。这意味着在Windows系统上,Java线程通常是使用Windows API实现的;UNIX和Linux系统经常使用Pthreads。

对于POSIX和Windows线程,任何数据被声明为全局的-----------也就是说,任何在函数之外声明的数据-------在属于同一进程的所有线程之间共享。

因为Java没有全局数据的概念,所以必须在线程之间显式地安排对共享数据的访问。

在函数内声明的本地数据通常存储在栈中。由于每个线程都有自己的栈,每个线程都有自己的本地数据副本。

作为一个示例,我们设计了一个多线程程序,该程序在一个单独的线程中使用众所周知的求和函数执行一个非负整数的求和:

创建多线程的两种通用策略

  • 异步线程
  • 同步线程

使用异步线程,一旦父线程创建了子线程,父线程将继续执行它,以便父进程和子进程并发执行。每个线程独立于其他线程运行,而父线程不需要知道它的子线程何时终止。因为线程是独立的,所以线程之间很少有数据共享。异步线程是图4.2中所示的多线程服务器中使用的策略。

同步线程是指在父线程创建一个或多个子节点,然后在恢复(resume)之前必须等待所有子节点终止----——即所谓的fork-join策略。在这里,由父进程创建的线程同时执行工作,但是在完成此工作之前,父线程不能继续执行。一旦每个线程完成了它的工作,它就会终止并与join到它的父线程。只有当所有的子线程都join后,父线程才能恢复(resume)执行。通常,同步线程涉及到线程之间的重要数据共享。例如,父线程可以将其不同子节点计算的结果组合在一起。下面的所有示例都使用同步线程

results matching ""

    No results matching ""