GNU pth vs. pthread
GNU pth vs. pthread
我想用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::thread
或boost::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
- 在所有操作系统上100%相同
- 你需要更少的代码
如果你写一个"低级"的应用程序,我建议你把你的应用程序分成后端和前端,为每个操作系统写一个自己的后端,并使用能解决最少问题的库。
- 在VS代码中交叉编译Windows与Linux上的MinGW的SDL程序
- 如何为模板化对象创建模板向量?VS正在投掷C3203
- 数据成员SFINAE的C++17测试:gcc vs clang
- 为什么在Windows上的VS 2019和Clang 9中"size_t"在没有标题的情况下工作
- 在for循环中使用auto vs decltype(vec.size())来处理字符串的向量
- 正在VS调试器中监视映射条目
- Confusion: decltype vs std::function
- 将IBM Rhapsody模型集成到VS 2019中
- VS Code "command":"make"与终端窗口中的命令行"make"不同
- 使用VS Code和CMake Tools运行自定义命令
- 修改 VS Code 中的默认C++代码段
- 如何使用c++在VS 2019上运行SQL查询
- vs 2015 constexpr变量不恒定,但与2019相比还好吗
- 完美前进使用 std::forward vs RefRefCast
- 从VS 2015更新3更新到VS2015更新3 d后浮点计算行为不同的原因
- VS 2015 链接错误 无法构建依赖于 libcurl 的项目
- consteval wrapper vs. source_location
- VS Code C++:不准确的系统包括路径错误(wchar.h,boost/lambda/lambda.hpp)
- NSOperationQueue vs pthread priority
- GNU pth vs. pthread