Articles of multithreading

如何从磁盘获得良好的并发读取性能

我想问一个问题,然后用我自己的答案进行跟踪,还可以看看其他人有什么答案。 我们有两个大文件,我们想同时从两个独立的线程中读取。 一个线程将顺序读取fileA,而另一个线程将顺序读取fileB。 线程之间不存在locking或通信,两者都按顺序快速读取,并立即丢弃所读取的数据。 我们在Windows上使用这个设置的经验非常差。 两个线程的总吞吐量在2-3 MiB / sec左右。 这个驱动似乎花费了大部分时间在两个文件之间来回转移,大概在每次查找后都读得很less。 如果我们禁用其中一个线程并暂时查看单个线程的性能,那么我们将获得更好的带宽(本机约45 MiB /秒)。 所以很明显,双线程的糟糕performance是操作系统磁盘调度器的一个假象。 我们能做些什么来提高并发线程读取性能吗? 也许通过使用不同的API或以某种方式调整操作系统磁盘调度程序参数。 一些细节: 在2GiB内存的机器上,每个文件的大小都是2 GiB。 为了这个问题的目的,我们认为他们不被caching和完全碎片整理。 我们已经使用碎片整理工具,并重新启动,以确保这种情况。 我们没有使用特殊的API来读取这些文件。 这个行为可以在各种各样的bog标准API中重复使用,比如Win32的CreateFile,C的fopen,C ++的std :: ifstream,Java的FileInputStream等等。 每个线程在一个循环中旋转,调用read函数。 我们已经从1KiB到128MiB之间的值,每次迭代都要求API的字节数。 改变这一点已经没有效果了,所以在每次磁盘寻道之后操作系统在物理上读取的数量不是由这个数字决定的。 这正是应该预料的。 单线程和双线程性能之间的巨大差异在Windows 2000,Windows XP(32位和64位),Windows Server 2003以及带和不带硬件RAID5的情况下都是可重复的。

OpenThread()返回NULL Win32

我觉得这个问题有一个明显的答案,但这个问题一直困扰着我。 我在C ++中有一些遗留代码,当它尝试调用OpenThread()时会中断。 我在Visual C ++ 2008 Express Edition中运行它。 程序首先获取调用线程的ThreadID,并尝试打开它,如下所示: ThreadId threadId = IsThreaded()? thread_id::: GetCurrentThreadId(); HANDLE threadHandle = OpenThread(THREAD_ALL_ACCESS,FALSE,threadId); 现在这是我不明白的:如果线程ID是当前线程的ID,是不是已经打开? 那可能是为什么它返回NULL? 对于任何反馈,我们都表示感谢。

什么涉及在Windows中安排线程?

当Windows调度一个线程时究竟发生了什么事情。 调度过程中涉及哪些计算资源。 更具体地说,有多lessCPU周期可以重新调度刚完成其时间片/量子 (因为没有其他线程) 的可运行线程 。

为什么我会使用“Both”COM线程模型而不是“Free”?

根据这篇文章,如果我注册我的COM对象与“两个”或“自由”的线程模型,该对象必须是完全线程安全的。 具体来说,所有对全局共享variables的访问都必须同步,并且所有对成员variables的访问也必须同步。 这是很多努力。 现在我明白了,能够注册我的对象为使用“免费”线程模型是有利的,可能值得付出代价,使其完全线程安全。 但为什么我想要做同样的事情,并使用“Both”线程模型来注册我的对象呢? 什么是优势? 我如何select“两者”和“免费”?

C ++挂钩到不同的应用程序,如何从进程IDfind线程ID?

我想给应用程序添加一个钩子。 我正在使用SetWindowsHookEx ,我可以创build一个系统范围的钩子,但我想为特定的应用程序创build一个钩子。 我需要有目标应用程序的线程ID挂钩它。 我知道窗口的标题,我知道EXE的名称,从这些我可以得到窗口句柄和进程ID,但我怎么得到线程ID? 我看到一篇关于如何在c#中完成的文章 ,但是我不明白如何获得c ++中的线程列表。 HWND windowHandle = FindWindow(NULL, _T("SomeOtherApp")); DWORD processId = GetWindowThreadProcessId(windowHandle, NULL); DWORD threadId = ??? // How do I get thread id here? HHOOK hook = ::SetWindowsHookEx( WH_CBT, HookCBTProc, hInst, threadId); 谢谢,亚历山大。

为什么将multithreading应用程序限制到一个内核会使其运行速度更快?

我有一个用C ++编写的本地multithreadingWin32应用程序,它有大约3个相对繁忙的线程和4到6个线程,这些线程没有那么多。 当它运行在正常模式下时,总共CPU使用率在8核机器上增加了大约15%,应用程序在大约30秒内完成。 而当我通过将亲和性掩码设置为0x01将应用程序限制为仅一个核心时,它在23秒内完成得更快。 我猜测它与限制在一个物理内核和/或一些并发内存访问问题上的同步更便宜有关。 我正在运行Windows 7 x64,应用程序是32位。 CPU是Xeon X5570,具有4个核心并启用了HT。 任何人都可以详细解释这种行为吗? 为什么会发生这种情况,以及如何提前预测这种行为? 更新:我想我的问题不是很清楚。 我想知道为什么它在一个物理内核上变得更快,而不是为什么在多个内核上它不会达到15%以上。

I / O完成端口* LAST *称为callback,或者:清除事物的安全位置

我想这个论点很重要,应该在这里有一些空间。 让我们考虑C / C ++中最常见的I / O完成端口devise,它具有一个抽象HANDLE的结构(或类),以及它的一些属性,如下所示: class Stream { enum { Open = 1, Closed = 0 }; // Dtor virtual ~Stream() { if (m_read_packet != 0) delete_packet(m_read_packet); // the same for write packet } // Functions: bool read(…) { if (m_read_packet != 0) m_read_packet = allocate_packet(); ReadFile(m_handle …); } bool write(…); bool close() […]

pthread-like windows手动重置事件

有没有更容易的解决scheme移植到pthread一个Windows手动重置事件,比pthread条件variables+ pthread互斥+标志如果事件设置或取消设置?

CreateThread vs fork()

fork()和CreateThread之间有什么关系吗? 有什么CreateThread内部调用fork()?

WaitForSingleObject – 做线程等待队列?

如果我设置了3个线程来等待一个互斥量被释放,他们是否根据它们所请求的顺序形成一个队列,或者它是不确定的行为(即我们不知道哪一个会首先拾取它)?