GNU pth vs. pthread

GNU pth vs. pthread

本文关键字:pthread vs pth GNU      更新时间:2023-10-16

我想用c++构建一个可移植且高效的服务器;它将有许多客户端试图同时连接,所以它必须能够并行处理每个请求。

我一直在努力寻找文档,指南…等等,用于多线程。我找到了很多关于POSIX Pthread的东西,但是几乎没有关于GNU Pth的东西(除了gnu.org的官方手册)。

那么,谁能解释一下POSIX Pthread和GNU Pth之间的区别?拜托,我希望回复不是维基百科内容的副本(请记住,我是多线程的绝对新手)。我希望我的服务器在所有基于unix的系统之间都是可移植和高效的,避免使用繁重的fork()。

谢谢你的帮助。

PS:我觉得最好在这里问:Windows怎么样?这里有Pthreads或Pth选项吗?如果没有,该操作系统的API是什么?

使用Pthreads,它使用更广泛,因此有更多的信息和支持。我从来没有遇到过真正使用GNU p的人。如果你正在使用c++ 11,最好使用std::thread,如果不是,那就使用boost::thread

那么,谁能解释一下POSIX Pthread和GNU Pth之间的区别?

Pthreads是可抢占多线程的跨平台标准,这意味着(通常)操作系统内核管理线程,操作系统调度器决定每个线程何时运行(如果你有一个单核,一次只能运行一个线程,如果你有多个核,一次可以运行多个线程)。OS调度器可以在(几乎)任何时间暂停任何线程,让另一个线程运行,所以每个线程得到一个有限的"时间片",然后其他线程可以运行。

GNU Pth是一个不可抢占的用户空间线程库,这意味着线程和哪个线程在哪个时间运行是由用户空间决定的,而不是由内核决定的。有些人说,使用不可抢占的线程库的程序更容易理解,因为你的线程不会在任意时间暂停,让另一个线程运行。

我希望我的服务器在所有基于unix的系统之间是可移植和高效的,避免使用沉重的fork()s。

fork在UNIX上并不重。

W* window呢?这里有Pthreads或Pth选项吗?如果没有,该操作系统的API是什么?

有Windows的pthreads api,但它们不是Windows操作系统的原生api。我不知道GNU Pth是否能在Windows上工作——我怀疑它,除非你使用Cygwin。Windows有自己的Win32线程模型。

使用std::threadboost::thread可以移植到POSIX平台和Windows,并且使API的某些部分更容易使用(特别是,锁定和解锁互斥锁可以很容易地以异常安全的方式完成,条件变量更容易使用)

Gnu PTH适用于非常有限的用例:您想使用多线程实现范例,但您希望使用多个cpu或内核,并且您不想依赖任何操作系统或内核级别的支持。由于几乎所有的通用cpu现在都有多核,所以这个用例越来越无关紧要。

Windows有一个独立于POSIX的线程模型;如果你希望你的应用程序是跨平台的,最好使用一个跨平台的线程库,比如boost::thread.

我认为GNUs的PTH首先意味着C。你也可以在c++中使用它,但是c++有它自己的。

有相当多的应用程序使用pth,如低级刻录工具(因此gui工具,如K3B和Brasero依赖于pth), GnuPG也使用pth, Archlinux的包管理和一些多媒体的东西。

在Windows上总是有点复杂。微软从来没有接受过C语言是unix系统的编程语言这一事实,因此正在遭受NIH症状(不是这里发明的)

所以他们做了很多没有任何优势的事情,只是为了与众不同。

如果你使用的应用程序应该在任何地方运行,它不是低级的,使用Qt的QThreads和QThreadPool

  1. 在所有操作系统上100%相同
  2. 你需要更少的代码

如果你写一个"低级"的应用程序,我建议你把你的应用程序分成后端和前端,为每个操作系统写一个自己的后端,并使用能解决最少问题的库。