POSIX线程 vs. Win32线程

14
我刚尝试了一下POSIX线程,并首次尝试了POSIX线程。直到现在,我一直认为POSIX线程和Win32线程之间有很大的架构差异,但从我所尝试的(虽然很少)来看,我并没有真正看到任何区别。
不过我仍然很好奇 - POSIX线程和Win32线程之间有哪些区别(如果有的话)?它们在根本上不同,还是只有微小的区别?

为什么Windows线程比POSIX线程更好:http://software.intel.com/en-us/blogs/2006/10/19/why-windows-threads-are-better-than-posix-threads/ 请务必阅读评论以获取有趣的转折(不幸的是,转折的原始来源似乎已经无法获得,但在评论中可以找到)。 - Michael Burr
@MichaelBurr 挑衅性的标题。顺便说一下,这篇文章已经在 Reddit 上被讨论过了(https://www.reddit.com/comments/1nemlz)。 - Hi-Angel
2个回答

14
在Windows NT家族内核和许多Unix内核中,线程的管理和调度方式有很大差异,但这不是问题所在。
如果您只是在谈论接口(Win32线程和POSIX线程公开的服务),通过一些工作,您几乎可以将任何POSIX线程特性映射到Win32等效 ~1:1。而且已经做到了(请参见pthreads-win32)。
我注意到的一个重要区别是,在Win32下,您使用实际的系统调用来处理线程,而POSIX线程的调用是库(pthreads)的一部分,在许多Unix系统下,它调用了Unix内核的一些非常低级的系统调用(在Linux下有clone())。
只是为了证明除非您深入研究,否则pthread并没有什么特别之处,您可以下载pthreads-win32,它公开了与pthread相同的界面,并且任何函数都映射到Win32线程API上。它是可行的。

我不同意一对一的对应关系。虽然我不太擅长多线程API,但pthread中有一件事情让我想起了signal。WinAPI没有办法在一个线程中设置特定信号的处理程序,然后从另一个线程向第一个线程发送信号,强制它中断当前代码并执行处理程序。当我不得不将在GNU/Linux中原型化的某些应用程序移植到C#的Windows上时,这是一个大问题——这样看似“普通”的功能在Windows上不可用,破坏了抽象层。 - Hi-Angel
@Hi-Angel:我认为信号处理程序是异步的?你怎么可能在没有警告的情况下随意“中断”线程呢?你是在说QueueUserAPC还是SendMessage吗? - user541686
@Mehrdad 这里有一个快速而简单的例子,演示了如何使用pthread发送信号。为了演示目的,我甚至没有放入第二个线程的sleep(),也就是说它不调用任何系统函数,而只是重复相同的代码。第一个线程在1秒的睡眠后,向子进程发送SIGUSR1信号,从而强制其执行处理程序,进而退出子进程。该示例适用于大多数现代操作系统。但在Windows上无法运行。 - Hi-Angel
@Hi-Angel:这不是极其危险吗?如果线程持有锁会发生什么?(例如,如果它正在分配内存?)如果它正在改变数据结构怎么办?这几乎肯定会破坏某些东西,不是吗? - user541686
1
@Hi-Angel: “我没有看到问题”……你看到了为什么你甚至不能在信号处理程序中调用*malloc*吗?考虑到这一点,你能向我解释一下你为什么认为信号比只是创建一个新线程并运行它更好吗?后者更安全、更少限制。 - user541686
显示剩余6条评论

1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接