Articles of multithreading

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个线程来等待一个互斥量被释放,他们是否根据它们所请求的顺序形成一个队列,或者它是不确定的行为(即我们不知道哪一个会首先拾取它)?

如何从C#中的工作线程发布UI消息

我正在用C#编写一个简单的Winforms应用程序。 我创build了一个工作线程,我希望主窗口响应完成工作的步骤 – 只需更改文本字段testField.Text =“就绪”中的某些文本即可。 我尝试了事件和callback,但是它们都是在调用线程的上下文中执行的,并且不能从工作线程执行UI。 我知道如何在C / C ++中做到这一点:从工作线程调用PostMessage。 我假设我可以从C#调用Windows API,但没有更多的.NET特定的解决scheme?