GNU pth与pthread

时间:2012-12-20 17:29:31

标签: c++ multithreading

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

我一直在努力寻找多线程的文档,指南等。我发现了很多关于POSIX Pthread的内容,但对于GNU Pth几乎没有(除了gnu.org中的官方手册)。

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

感谢您的帮助。

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

3 个答案:

答案 0 :(得分:5)

使用Pthreads,更多使用得更广泛,因此可以获得更多信息和支持。我从来没有见过任何真正使用过GNU Pth的人。或者更好的是,如果您使用的是C ++ 11,请使用std::thread,否则请使用boost::thread

  

那么,任何人都能解释一下POSIX Pthread和GNU Pth之间的区别吗?

Pthreads是一个跨平台的可预占多线程标准,意味着(通常)操作系统内核管理线程,操作系统调度程序决定每个线程何时运行(如果你有一个核心只有一个线程可以运行一次,如果你有多个核心,一次可以运行多个线程)。操作系统调度程序可以在(几乎)任何时候暂停任何线程并让另一个线程运行,这样每个线程都会获得有限的“时间片”,然后其他线程就会运行。

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

  

我希望我的服务器在所有基于* nix的系统之间可移植且高效,不要使用繁重的fork()。

fork在UNIX上并不重要。

  

W * ndows怎么样? Pthreads或Pth是选项吗?如果没有,该操作系统的API是什么?

有适用于Windows的pthreads API,但它们不是Windows操作系统的原生API。我不知道GNU Pth是否适用于Windows - 我对此表示怀疑,除非您使用Cygwin。 Windows有自己的Win32线程模型。

使用std::threadboost::thread可以移植到POSIX平台和Windows,并使API的某些部分更易于使用(具体来说,锁定和解锁互斥锁可以通过异常安全的方式轻松完成,条件变量更容易使用。)

答案 1 :(得分:3)

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

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

答案 2 :(得分:1)

我认为GNU PTH首先用于C语言。您也可以在C ++上使用它,但无论如何C ++都有它自己。

有很多应用程序使用类似低级刻录工具的pth(因此像K3B和Brasero这样的GUI工具依赖于pth),GnuPG也使用PTH,Archlinux的包管理和一些多媒体内容。

在Windows上它总是有点复杂。微软从来没有克服这样一个事实:C是来自/用于UNIX系统的编程语言,因此遭受了NIH症状(不是在这里发明)

所以他们做了很多事情而没有任何好处只是为了与众不同。

如果您使用的应用程序应该在任何地方运行而且不是低级别的,请使用Qt及其QThreads和QThreadPool

  1. 在所有操作系统上100%相同
  2. 您需要更少的代码
  3. 如果您编写“低级”应用程序,我建议将应用程序拆分为后端和前端,并为每个操作系统编写自己的后端,并使用最少出现问题的库。