Articles of multithreading

上下文切换可能导致高CPU

我们正在分析性能问题,我们最多可能有500个工作线程,CPU使用率不是很高。 上下文切换可能导致高CPU? 换句话说,由于CPU使用率不高,上下文切换(500个线程)在这里不成问题。

提高Windows的互斥体实施

据我所知,在旧版本的Boost boost::mutex实现中,Windows是使用临界区域完成的。 但在最新版本的Boost 1.51中,我发现互斥体的实现是基于事件的。 有人知道这个变化背后的理由是什么吗? 是否因性能原因而完成? 关键部分是否被弃用?

multithreading和多进程的性能差异

几年前,在Windows环境中,我做了一些testing,让CPU计算密集型+内存访问密集型+ I / O访问密集型应用程序的多个实例运行。 我开发了两个版本:一个在多处理下运行,另一个在multithreading下运行。 我发现多处理的性能要好得多。 我读了其他地方(但我不记得该网站)。 其中的原因是在multithreading的情况下,对于单个内存pipe道和I / Opipe道来说,它们是“战斗”的,这使得性能比多处理 但是,我再也找不到那篇文章了。 我想知道,直到今天,下面的情况是否仍然如此? 在Windows中,使algorithm代码在多处理下运行,性能会比multithreading更好。

Grand Central Dispatch(`libdispatch`)是否可以在Windows上使用?

我正在研究multithreading,GCD似乎比使用pthread.h和pthreads-win32手动编写解决scheme更好。 不过,尽pipe看起来libdispatch正在开发或即将开始工作,但是大多数新的POSIX兼容系统…我必须问,Windows怎么样? libdispatch移植到Windows有什么机会? 防止这种情况发生的障碍是什么? 如果说到这一点, 我需要做些什么来预制这个portage? 编辑:我已经知道的一些事情,开始讨论: 我们需要一个可在Windows上编译的块兼容编译器,不是吗? PLBlocks会处理吗? 我们可以使用LLVM 块的运行时间吗? 我们libdispatch用APR调用replace用户空间libdispatch所有pthread.h依赖项,以实现可移植性吗? 或者,或者,使用pthreads-win32我想… 编辑1:我听说,这是完全不可能的,永远不会,因为libdispatch (不知何故)取决于kqueue ,它不能在Windows上提供…有没有人知道这是真的吗?

Direct2D中的multithreading

我正在尝试创build一个简单的D2D游戏引擎(它至less必须能够在窗口中显示和移动图像),并且一切正常,直到决定切换到multithreading版本。 我阅读这篇 MSDN文章,并build议从多个线程使用一个multithreading工厂。 但是这篇文章声称,有几个单线程工厂会更有效率(尽pipe本文描述了服务器端渲染场景,原理与我的情况相同,我错了吗?)。 当我尝试使用单线程工厂的方法时,所有的图像都被显示和移动,但是有可怕的闪烁。 在我的WM_PAINT处理程序,我试图做这样的事情: for (CSingleThreadEngine *pElSingleThreadEngine : m_SingleThreadEngines) //each CSingleThreadEngine instance has its own D2D factory and an image collection pElSingleThreadEngine->Draw(); 和pElSingleThreadEngine-> Draw()是这样画的: m_pRenderTarget->BeginDraw(); m_pRenderTarget->SetTransform(D2D1::Matrix3x2F::Identity()); m_pRenderTarget->Clear(D2D1::ColorF(D2D1::ColorF::White)); for (CGameImage *pImage : m_GameImages) { if (FAILED(pImage->Draw())) throw runtime_error("An object cannot be drawn"); } m_pRenderTarget->EndDraw(); 我认为这里的错误是只有一个窗口有几个ID2D1HwndRenderTarget实例,因为如果我在单独的窗口中绘制每个线程,它就可以工作。 但是我只想在一个窗口中绘制,而且我无法避免为此使用多个ID2D1HwndRenderTarget实例。 所以我的问题是: 创buildmultithreadingDirect2D应用程序的最佳做法是什么? 如果我正在使用的方法是正确的,我在做什么错了,我该如何解决? 任何帮助将不胜感激。

从C#调用WaitForSingleObject

我正在尝试从C#中调用WaitForSingleObject方法,如下所述: https://msdn.microsoft.com/en-us/library/windows/desktop/ms687032(v=vs.85).aspx 为了调用这个函数,我需要创build一个Handle,或者我需要得到一个IntPtrtypes的Handle,怎么做? 我试过这个function,我发现: http : //www.pinvoke.net/default.aspx/kernel32.WaitForSingleObject [DllImport("coredll.dll", SetLastError = true, CallingConvention = CallingConvention.Winapi, CharSet = CharSet.Auto)] public static extern IntPtr CreateEvent(HANDLE lpEventAttributes, [In, MarshalAs(UnmanagedType.Bool)] bool bManualReset, [In, MarshalAs(UnmanagedType.Bool)] bool bIntialState, [In, MarshalAs(UnmanagedType.BStr)] string lpName); 或者,例如,当我从控制台获取句柄时: IntPtr handle = Process.GetCurrentProcess().MainWindowHandle; 它抛出一个DllNotFoundException。 这里有什么问题? 我需要它来运行这个函数调用的过程,并从它的过程中获取一个转储,用于我的ClrMd库学习。 任何帮助将不胜感激。 代码示例: static void Main(string[] args) { var autoEvent = new AutoResetEvent(false); […]

获取进程主线程的句柄

我在一些小的testing应用程序中创build了一个额外的线程,并希望从这个额外的线程挂起主线程。 额外的线程是通过CreateRemoteThread从外部进程创build的。 由于SuspendThread需要一个HANDLE来挂起线程,我想知道如何从我的附加线程中运行的代码中获得这个HANDLE 。

Windows API类似于pthread_cancel?

是否有一个Windows的本地API类似于pthread_cancel,pthread_testcancel等? 如果不是,我们如何在Windows中使用pthread_cancel机制来模拟取消另一个线程?

在编译boost时,“threading = multi”究竟是做什么的?

我不完全确定在构buildboost时, threading=multi标志究竟是做什么的。 该文件说: Causes the produced binaries to be thread-safe. This requires proper support in the source code itself. 这似乎不是很具体。 这是否意味着访问,例如,提升容器是由mutexes/locks或类似的守卫? 由于我的代码的性能是至关重要的,我想尽量减less不必要的互斥体等。 一些更多细节: 我的代码是一个插件DLL,它被加载到一个multithreading的第三方应用程序中。 我静态链接升压到DLL(该插件是不允许有除标准的Windows DLL的任何其他依赖项,所以我被迫这样做)。 虽然应用程序是multithreading的,但我的DLL中的大部分函数只能从一个线程调用,因此访问容器不需要保护。 我明确地通过使用boost::mutex和friends来防范我的代码的其余部分,这些代码可以从多个线程中调用。 我已经尝试使用threading=multi和threading=single来构buildboost,两者似乎都可以工作,但我真的很想知道我在这里做了什么。

我怎样才能保护一个互斥体的载体?

我正在devise一个接受多个不同交互客户端的C ++服务器,并使用向量来分别跟踪所有这些客户端。 不过,我意识到,由于运行了这么多的线程,一个向量可能被两个线程同时读取和写入的可能性很小。 有没有一个快速和安全的方法来添加互斥或东西,以便它将等到所有的读取完成,直到另一个function添加到它? 不这样做可能会搞乱协议,甚至可能导致服务器崩溃。 我有一个想法创build一个全局variables,将所有读取locking向量,但我不知道是否可以告诉线程相互排斥该variables(即不改变布尔为假,并检查它为真同时,这个机制没有意义)。 我正在使用Windows 7(Visual Studio 2010 Pro)。 感谢您的任何和所有的build议!