我想用C++构建一个可移植且高效的服务器;它将有许多客户端同时尝试连接,因此它必须能够并行处理每个请求。
我一直在找文档,指南...等等,用于多线程。我找到了很多关于POSIX Pthread的信息,但几乎没有关于GNU Pth的(除了gnu.org的官方手册)。
那么,谁能给我解释一下POSIX Pthread和GNU Pth之间的区别?请注意,我希望得到的回复不是Wikipedia内容的副本(请记住,我对多线程完全是个新手)。我希望我的服务器在所有基于*nix的系统之间都是可移植和高效的,避免使用繁重的fork()。
谢谢你的帮助。
PS:我认为在这里问这个问题更好: Windows呢?Pthread或Pth是可选的吗?如果不是,该操作系统的API是什么?
发布于 2012-12-21 01:40:06
我从来没有遇到过真正使用GNU Pth的人。或者更好的是,如果您正在使用C++11,则使用std::thread,如果不是,则使用boost::thread。
Pthread是可抢占多线程的跨平台标准,这意味着(通常) OS内核管理线程,OS调度程序决定每个线程何时开始运行(如果您有单个内核,则一次只能运行一个线程,如果您有多个内核,则可以同时运行多个线程)。操作系统调度程序可以在(几乎)任何时候暂停任何线程,并让另一个线程运行,因此每个线程获得一个有限的“时间片”,然后其他线程开始运行。
GNU Pth是一个不可抢占的用户空间线程库,这意味着线程以及在什么时间运行的线程在用户空间而不是内核中决定。有些人说,使用不可抢占线程库的程序更容易理解,因为你的线程不会在任意时间暂停,让另一个线程运行。
我希望我的服务器在所有基于*nix的系统之间是可移植的和高效的,避免使用繁重的fork()。
fork在UNIX上并不是很重。
W*ndows呢?Pthread或Pth是可选的吗?如果不是,该操作系统的API是什么?
有针对Windows的pthreads,但它们不是Windows操作系统原生的。Windows有自己的Win32线程模型。
使用std::thread或boost::thread可以移植到POSIX平台和Windows,并使该API的某些部分更易于使用(具体地说,锁定和解锁互斥锁可以以异常安全的方式轻松完成,条件变量也更易于使用)。
发布于 2012-12-21 01:44:30
Gnu PTH适用于一个非常有限的用例:您希望使用多线程实现范例,但不希望使用多个CPU或内核,并且不希望依赖任何操作系统或内核级支持。由于现在几乎所有的通用CPU都有多核,所以这个用例越来越不重要了。
Windows有一个独立于POSIX的线程模型;如果您希望应用程序是跨平台的,最好使用跨平台的线程库,比如boost::thread。
发布于 2014-02-23 03:02:07
我认为GNUs PTH首先是为了C而设计的。你也可以在C++上使用它,但是C++也有它自己的。
有相当多的应用程序使用PTH,如低级刻录工具(因此K3B和Brasero等图形用户界面工具依赖pth),还有GnuPG使用pth、Archlinux的包管理和一些多媒体内容。
在Windows上,它总是有点复杂。微软从来没有忘记这样一个事实,即C是来自UNIX系统的编程语言,也是用于UNIX系统的编程语言,因此NIH Symptome (不是在这里发明的)正在遭受痛苦。
所以他们做了很多没有任何优势的事情,只是为了与众不同。
如果您使用的应用程序应该在任何地方都可以运行,并且它的级别不低,那么可以使用Qt及其QThreads和QThreadPool
如果你写一个“低级”的应用程序,我建议你把你的应用程序分成后端和前端,并为每个操作系统编写一个自己的后端,并使用问题最少的库。
https://stackoverflow.com/questions/13977488
复制相似问题