Articles of multithreading

C + + 11的std ::线程与Windows CreateThread的

哪个选项更适合在Visual C ++下创build(和pipe理)线程:C ++ 11 std::thread或者WinAPI函数(比如CreateThread , _beginthreadex等),为什么?

来自CreateWindow / CreateDialog的HWND可以从另一个线程获取消息吗?

使用Win32 API,是否可以在一个线程中创build一个窗口或对话框,然后从另一个线程收集事件? HWND是否与线程绑定? 尝试下面的人为的例子,我从来没有看到GetMessage()火。 HWND g_hWnd; DWORD WINAPI myThreadProc(LPVOID lpParam) { while(GetMessage(&msg,hWnd,0,0)> 0) { … } } int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nShowCmd) { hWnd = CreateDialog(hInstance,MAKEINTRESOURCE(IDD_MYDIALOG),0,myDlgProc); CreateThread(NULL,0 myThreadProc,NULL,0,NULL); … } 但在这里,我呢。 HWND g_hWnd; HINSTANCE g_hInstance; DWORD WINAPI myThreadProc(LPVOID lpParam) { hWnd = CreateDialog(hInstance,MAKEINTRESOURCE(IDD_MYDIALOG),0,myDlgProc); while(GetMessage(&msg,hWnd,0,0)> 0) { … } } int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE […]

是否有任何理由不在Python中混合使用多处理和线程模块

我正在考虑使用Python来实现一个程序,这需要广泛的multithreading。 另一个要求是,它将在桌面上运行,所以有很多进程,将使应用程序看起来凌乱,更难杀(在任务pipe理器中)。 因此,我正在考虑同时使用线程和多处理模块来减less进程的数量。 据我所知,GIL将只适用于一个单一的过程。 我的问题是:是否有任何理由不混合使用这两个模块?

来自目标线程的PostThreadMessage

今天,我看到了一个代码: void Foo() { MyMsgStruct myMsg; /* omission for simplicity */ /* send to update thread */ PostThreadMessage(myThreadId, myMessage, (WPARAM)myMsg, NULL); } 当Foo()从与myThreadId相同的线程中被调用时,会发生什么情况,即从应该是目标线程的同一个线程中myThreadId ? 这是一个性能问题,或只是不好的代码或两者兼而有之? 我相信这可能会影响性能,因为我相信它会将消息排队到线程的队列,而不是做它应该做的事情,因此会稍微减慢程序。 线程安全不是我关心的这个问题 。

是否有必要在退出Win32应用程序之前明确停止所有线程?

我有一个Win32本地VC ++应用程序,进入WinMain()启动一个单独的线程,然后做一些有用的工作,而其他线程正在运行,然后只是退出WinMain() – 另一个线程是不明确停止。 这个博客文章说,在这种情况下,.NET应用程序不会终止,因为另一个线程仍在运行。 这同样适用于本机Win32应用程序吗? 在退出之前是否必须停止所有线程?

如何在Windows上select()中取消等待

在我的程序中,有一个线程(接收线程)负责接收来自TCP套接字的请求,并且有许multithreading(工作线程)负责处理接收到的请求。 一旦请求被处理,我需要通过TCP发送一个答案。 这是一个问题。 我想用与接收数据相同的线程发送TCP数据。 接收数据后的这个线程通常会等待select()新数据。 因此,一旦工作线程完成处理请求并在输出队列中input答案,它必须向接收线程发送有数据要发送的信号。 问题是,我不知道如何取消select()中的等待,以便退出等待并调用send() 。 或者我应该使用另一个线程来通过TCP发送数据? 更新 MSalters,Artyom谢谢你的回答! MSalters,阅读你的答案我发现这个网站: Winsock 2 I / O方法和阅读有关WSAWaitForMultipleEvents() 。 我的程序实际上必须在HP-UX和Windows上都能正常工作。我终于决定使用Artyom提出的方法。

如何在C ++中提前分配内存?

总体情况 对带宽,CPU使用率和GPU使用率都非常敏感的应用程序需要每秒从一个GPU向另一个GPU传输大约10-15GB的数据。 它使用DX11 API来访问GPU,因此上传到GPU只能在需要映射每个单独上传的缓冲区时发生。 上传一次以25MB的大小发生,16个线程同时向缓冲区写入缓冲区。 关于这一点,没有什么可以做的。 写入的实际并发级别应该较低,如果它不是以下错误。 这是一个带有3 Pascal GPU,高端Haswell处理器和四通道RAM的强大工作站。 在硬件上没有太多可以改进的地方。 它运行的是Windows 10的桌面版本。 实际问题 一旦我传递了大约50%的CPU负载, MmPageFault()某些东西(在Windows内核中,当访问已映射到您的地址空间但尚未被操作系统提交的内存时调用)破坏严重,其余50% MmPageFault()的旋转锁正在浪费CPU负载。 CPU使用率达到100%,应用程序性能完全降低。 我必须假设,这是由于每秒需要分配给进程的大量内存,而且每次DX11缓冲区未映射时,这些内存也完全没有映射到进程中。 相应地,实际上每秒有数千次对MmPageFault()的调用,随着memcpy()被顺序写入缓冲区而顺序发生。 每遇到一个未提交的页面。 一旦CPU负载超过50%,保护页面pipe理的Windows核心中的乐观旋转locking会完全降低性能。 注意事项 缓冲区由DX11驱动程序分配。 没有什么可以调整分配策略。 使用不同的内存API,特别是重复使用是不可能的。 调用DX11 API(映射/取消映射缓冲区)全部来自单个线程。 实际的复制操作可能发生在multithreading上,而不是系统中的虚拟处理器。 减less内存带宽的要求是不可能的。 这是一个实时应用程序。 事实上,硬性限制目前是主要GPU的PCIe 3.0 16x带宽。 如果可以的话,我已经需要进一步推进了。 避免使用multithreading副本是不可能的,因为有独立的生产者 – 消费者队列,这些队列不能被轻易地合并。 自旋锁性能的下降似乎是非常罕见的(因为使用案例推得这么远),在Google上,你不会发现自旋锁函数名称的单一结果。 升级到对映射(Vulkan)进行更多控制的API正在进行中,但它不适合作为短期修复。 由于相同的原因,切换到更好的操作系统内核目前不是一种select。 减lessCPU负载也不起作用; 除了(通常微不足道的和廉价的)缓冲拷贝外,还有太多的工作需要完成。 问题 可以做什么? 我需要显着减less个别页面错误的数量。 我知道映射到我的进程的缓冲区的地址和大小,我也知道内存还没有被提交。 我怎样才能确保尽可能less的交易提交内存? DX11的exception标志,它可以防止取消映射后的缓冲区解除分配,Windows API强制在单个事务中提交,几乎任何东西都是值得欢迎的。 目前的状态 // In the processing […]

_fread_nolock,_fseek_nolock的用途是什么?

我们有一个基本上从二进制文件中读取和写入向量的C ++类。 将单个向量载入内存的示例性读取函数如下所示: int load (const __int64 index, T* values) const { int re = _fseeki64(_file, index * _vectorSize + _offsetData, SEEK_SET); assert(re == 0); size_t read = fread(values, sizeof(T), _vectorElements, _file); assert(read == _vectorElements); return 0;} Out程序是OpenMP的multithreading,multithreading同时访问同一个文件。 为了避免由于multithreading引起的问题,我们总是覆盖OpenMP临界语句中的函数调用: #pragma omp critical { load(…); } 我知道Microsoft Visual C ++运行时包含_fseek_nolock , _fread_nolock , _fwrite_nolock等几个函数…例如_fread_nolock()函数被描述为 这个函数是fread的一个非locking版本。 除了不受其他线程的干扰之外,它与fread相同。 […]

Java ProcessBuilder:结果进程挂起

我一直在尝试使用Java的ProcessBuilder在Linux中启动应该“长期”运行的应用程序。 这个程序运行的方式是启动一个命令(在这种情况下,我启动一个媒体播放应用程序),让它运行,并检查,以确保它没有崩溃。 例如,检查PID是否仍然有效,然后重新启动进程,如果它已经死了。 我现在得到的问题是,PID在系统中保持活动状态,但应用程序的GUI挂起。 我尝试将ProcessBuilder(cmd).start()转换为一个单独的线程,但似乎没有解决任何问题,正如我所希望的那样。 基本上,对于用户来说,程序APPEARS已经崩溃,但是杀死驱动ProcessBuilder.start()进程的Java进程实际上允许创build的进程恢复其正常行为。 这意味着Java应用程序中的某些内容正在干扰生成的进程,但我完全不知道在这一点上是什么。 (因此,为什么我试图把它分成另一个线程,这似乎没有解决任何问题) 如果有人有任何意见或build议,请让我知道,因为我不能为了我的生活而想到如何解决这个问题。 编辑:我不关心从stream程创build的I / Ostream,因此没有采取任何措施来处理 – 这可能会导致stream程本身的挂起?

检查线程是否完成的正确方法?

我正在使用_beginthread在我的应用程序multithreading,现在等待,直到所有的线程完成我有全局布尔值设置为true每个线程完成,所以我在一个while循环,直到那时。 必须有一个更干净的方式来做到这一点? 谢谢