2010-10-27 64 views
-2

我想知道,pthreads-win32(pthreads的windows实现)如何实现交叉线程?它是专门用Windows API编写的吗?我检查了一些源代码,似乎大多数确实是用windows API编写的,我想知道它是否使用Windows调度程序在线程(和核心)之间切换,或者它是否实现它自己的?具体来说,现在大多数处理器都实现了自己的调度器(例如,我已经阅读了关于itanium arch的内容,硬连线逻辑支持每个内核两个线程,甚至可以通过hw逻辑在它们之间自动切换,所以很显然OS支持多核并不一定需要),所以如果我有一个像Windows 32位或不支持多核处理器的过时操作系统,使用pthreads-win32编写的程序仍然可以运行在多个处理器内核上,或者只运行一个内核用过的?pthreads如何进行交叉线程和调度

pthreads实现(untainted posix线程)如何?即使它们运行的​​操作系统不支持多核处理器吗?

我猜测答案是否定的,对于windows和posix版本,如果操作系统不支持多核,那么只有一个内核正在使用。这只是一个受过教育的猜测,我想确认一下,所以请留下评论。

在一个方面的请求,你可以推荐一个支持多核心线程执行的lib,即使程序运行的OS不是。如果有任何c。

另外,有没有一种方法可以确保使用pthreads写入的两个线程在不同的核心上执行,或者操作系统(或处理器或pthreads库)是否自动执行分配? pthreads是否保证在不同内核上执行?

干杯,缬氨酸

编辑: 我知道大多数的这些问题,是实现特定的,所以我指的是这个实现并行线程的窗户http://sourceware.org/pthreads-win32/。我之前没有具体提及它,因为据我所知,这是Windows中最流行和广泛使用的pthreads实现。

回答

1

所以从我所得到的,最重要的是要注意的是,线程与并行性(如多核处理器的UMA)很少有关。所以虽然线程可能是一种实现并发的技术,但它不是确保ACTUAL并行执行的一种方式,这正是我一直在寻找的,因为我正在研究并行和分布式系统和算法。

所以一次回答一个问题。是的,pthreads,可能大多数(如果不是全部的话)其他线程API都基于底层OS API。哪一个给他们的操作系统具有相同的限制。意思是,如果操作系统(具体来说,在这种情况下,某些窗口运行例如pthreads-win32)不支持多个内核,则始终只有一个内核正在使用。正如在nob提供的wiki页面上指出的那样,引用:“超线程不仅要求操作系统支持多个处理器,而且还要特别针对HTT进行优化,并且Intel建议在使用具有HTT的操作系统时禁用HTT没有如此优化。“ http://en.wikipedia.org/wiki/Hyper-threading在大多数情况下,只有硬连线处理器(基本)调度程序不足以利用多核,它必须由SW(OS支持)支持/使用。虽然这可能不是一个明确的证据,但我相信足够的证据指向相同的方向来证实这一点。

我没有通过pthreads(对于兼容posix的操作系统)源代码进行筛选,我猜这个API也是一样,因为它更可能使用底层OS API。你必须自己确认。 :)

而且,任何潜在的库,在那里,可以支持多个内核上执行,即使在它们正运行在不支持多内核的操作系统,你必须找到他们自己的(如果他们存在),请留下评论。

为了确保平行度(在不同核心上执行)手动,Linux确实提供了一种针线程到特定的虚拟处理器(在一定条件下)。要将整个过程固定到特定的(虚拟)处理器/内核,可以使用sched_setaffinity()(来自sched.h)。正如nos指出的那样,pthreads提供了pthread_setaffinity_np()来将特定的线程固定到特定的核心。 Windows支持与SetThreadAffinityMask()类似的功能,因此很明显,可以手动将线程分配到不同内核上并行运行(如果操作系统支持多内核)。如果你为使用多线程(超过2)的代码编写代码,它们应该在多个物理内核上执行(如果可用的话)(这可能是pthread使用的操作系统功能) 。

我的问题是相当普遍的,首先,因为这些东西大部分都是指定,很难给出一个答案。我希望这个答案足够详细,可以帮助你澄清一些事情。

干杯,Val

+0

大多数操作系统都提供了一种将线程固定到不同内核的方法。你可以使用pthread_setaffinity_np() – nos 2010-10-28 18:10:18

+0

将一个特定的线程分配给一个核心。谢谢。你是对的,我正在传播错误信息(在另一篇文章中发现)。 Linux确实提供了一种将线程固定到特定虚拟处理器(在特定条件下)的方法。实际上,我在sched_setaffinity()之前(来自sched.h)遇到过,它基本上做了同样的事情,除了将整个进程固定到核心。无论如何,windows支持与SetThreadAffinityMask()类似的功能,很明显,可以手动将线程分配到不同内核上并行运行(如果操作系统支持多内核)。我会在早上纠正我的上述帖子:) Greets – valekovski 2010-10-29 00:33:58

0

通常,每个现代操作系统都支持线程本身,并将它们调度到系统的不同(虚拟)内核。操作系统提供了一些通用的同步技术(如Mutexes或Semaphores或Barriers),pthread使用它们来实现pthreads API。

在某些英特尔处理器(如Itanium)上,每个内核有两个线程(我认为您的意思是超线程),因此操作系统会看到两个“虚拟”内核。处理器的确将两个线程调度到一个物理内核上。 (请参阅Wikipedia

但是,有些示例中Runtime-Plattforms实现了自己的Thread-Conceptepts并执行了调度:我想到(至少较旧的)Java实现具有它们自己的调度例程。

+0

嗨。我已经遇到了您提到的维基页面,但我错过了相关信息。每个物理核心有两个VIRTUAL核心,谢谢。这实际上回答了我的另一个问题(为什么我的程序的线程版本运行速度较慢,然后是非线程,我创建了2个线程,因为我认为,对于核心二重奏来说更多是浪费:))。另外,是的,java DOES实现了它自己的线程和调度概念,但它仍然使用底层操作系统来构建这个抽象,所以它受到相同操作系统内部部件的阻碍。参考:http://www.janeg.ca/scjp/threads/scheduling.html – valekovski 2010-10-27 20:16:45