操作系统中的 POSIX 线程
操作系统中的 POSIX 线程:
POSIX 线程库是基于标准的 C/C++ 线程 API。它支持创建新的并发流程。它在多处理器或多核系统上运行良好,其中进程流可以被安排在另一个处理器上执行,通过并行或分布式处理提高速度。因为系统不会为进程创建新的系统、虚拟内存空间和环境,线程比“分叉”或创建新进程不需要额外开销。虽然多处理器系统是最有效的,但在利用 I/O 延迟和其他可能阻碍进程执行的系统进程的单处理器系统上也可以获得好处。
要使用 PThread 接口,我们必须在 CPP 脚本的开头包含头文件 pthread.h。
#include
PThreads 是一个高度具体的多线程系统,是 UNIX 系统的默认标准。 PThreads是POSIX线程的缩写,POSIX是Portable Operating System Interface的缩写,是操作系统必须实现的一种接口。 POSIX 中的 PThreads 概述了操作系统必须提供的线程 API。
为什么使用 Pthreads?
- 采用 Pthreads 的根本目的是为了提高程序性能。
- 与启动和管理进程的费用相比,线程需要的操作系统开销要少得多。线程管理比进程管理占用更少的系统资源。
- 一个进程的线程都共享相同的地址空间。线程间通信比进程间通信更有效,并且在许多情况下对用户更友好。
- 与非线程程序相比,线程应用程序以多种方式提供了可能的性能提升和实际优势。
- 多线程程序将在单处理器系统上运行,但会自动使用多处理器机器而无需重新编译。
- 在多处理器系统中使用 Pthreads 的最重要原因是利用可能的并行性。这将是本课其余部分的主要重点。
- 为了让程序使用 Pthreads,它必须被划分为可以并发运行的离散的、独立的任务。
新线程变为可运行的,它将开始使用 arg 参数作为参数执行启动例程。 arg 参数是一个空指针,可以指向任何类型的数据。不建议将此指针转换为标量数据类型(例如 int),因为转换可能不可移植。
让我们看一个更好的实现方法的 C 示例:
C
#include
#include
#include
void *print_message_function( void *ptr );
main()
{
pGeeksforGeeks_t GeeksforGeeks1, GeeksforGeeks2;
char *message1 = "GeeksforGeeks 1";
char *message2 = "GeeksforGeeks 2";
int geeky1, geeky2;
geeky1 = pGeeksforGeeks_create( &GeeksforGeeks1, NULL, print_message_function, (void*) message1);
geeky2 = pGeeksforGeeks_create( &GeeksforGeeks2, NULL, print_message_function, (void*) message2);
pGeeksforGeeks_join( GeeksforGeeks1, NULL);
pGeeksforGeeks_join( GeeksforGeeks2, NULL);
printf("GeeksforGeeks 1 returns: %d\n",geeky1);
printf("GeeksforGeeks 2 returns: %d\n",geeky2);
exit(0);
}
void *print_message_function( void *ptr )
{
char *message;
message = (char *) ptr;
printf("%s \n", message);
}
该程序产生五个线程,每个线程运行执行工作函数,该函数将线程的唯一编号发布到标准输出。如果程序员希望线程彼此交互,他或她必须创建一个在任何函数范围之外定义的全局变量。以下命令可用于使用 gcc 编译器编译此程序。
gcc pthreads_demo.c -lpthread -o pthreads_demo
由于 Windows 本身不支持 pthreads 标准,因此 Pthreads-w32 项目旨在创建一个可移植的开源包装器实现。它还可用于将 Unix 应用程序(使用 pthreads)传输到 Windows,而对平台几乎没有任何更改。经过一些额外的更新,最新版本 2.8.0 与 64 位 Windows 计算机兼容。
Winpthreads 是 mingw-w64 项目中 pthread 的封装实现,它试图使用比 Pthreads-w32 项目更多的本机系统调用。