Articles of multithreading

为什么将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?

释放在WPF中创build的命名互斥体Application.OnStartUp():哪个线程拥有它?

我在WPF应用程序的OnStartup方法中创build一个互斥体。 该程序中没有使用互斥锁,它的唯一目的是防止某些程序同时运行。 如何在应用程序closures时释放此互斥锁? 根据文档 , mutex.ReleaseMutex()必须从创build互斥体的同一线程调用。 然而,这提出了一个问题,因为我不控制调用OnStartup()的线程。 假设我的OnStartup方法如下所示: public partial class App : Application { private Mutex mutex; private bool hasHandle = false; protected override void OnStartup(StartupEventArgs e) { bool createdNew; mutex = new Mutex(false, @"Global\XYZ", out createdNew); try { hasHandle = mutex.WaitOne(5000, false); if (!hasHandle) {/*do stuff*/}; } catch (AbandonedMutexException) { hasHandle = true; […]

multithreading可以在单个处理器系统上实现吗?

我始终遵循multithreading只能在多处理器系统上实现的概念,即多个处理器分配给每个线程,每个线程可以同时执行。 在这种情况下没有调度,因为每个线程都有单独的资源专用于它。 但是我可以在某处读到它,也可以在单处理器系统上执行multithreading。 这是对的吗? 如果是,那么单处理器和多处理器系统有什么区别?

如何获取进程的主线程标识(由其ID标识)?

你能帮我find一个ID进程的主(唯一)线程ID吗? 任务上下文:正在运行的进程(目前)没有窗口,而是(某些)线程。 通缉:仅在主线程中发布WM_QUIT 。 不想要的:在非主线程上使用TerminateProcess或发送WM_QUIT 。

读取互锁variables

承担: A. WIN32下的C ++。 B.使用InterlockedIncrement()和InterlockedDecrement()递增和递减正确alignment的易失性整数。 __declspec (align(8)) volatile LONG _ServerState = 0; 如果我只想读取_ServerState,是否需要通过InterlockedXXX函数读取variables? 例如,我看过如下的代码: LONG x = InterlockedExchange(&_ServerState, _ServerState); 和 LONG x = InterlockedCompareExchange(&_ServerState, _ServerState, _ServerState); 目标是简单地读取_ServerState的当前值。 我不能简单地说: if (_ServerState == some value) { // blah blah blah } 似乎有一些WRT这个问题混淆。 我知道寄存器大小的读取在Windows中是primefaces的,所以我认为InterlockedXXX函数是不必要的。 马特·J 好的,谢谢你的回应。 顺便说一下,这是Visual C ++ 2005和2008。 如果这是真的,我应该使用InterlockedXXX函数来读取_ServerState的值,即使只是为了清楚起见,什么是最好的方式去做呢? LONG x = InterlockedExchange(&_ServerState, _ServerState); 当我真正想做的事情是读取它时,这有修改价值的副作用。 不仅如此,如果存在上下文切换,则可能会将该标志重置为错误值,因为在调用InterlockedExchange()准备过程_ServerState的值压入堆栈。 […]