Articles of multithreading

在Linux中等待WaitForSingleObject和WaitForMultipleObjects

我正在从Windows到Linux迁移应用程序。 我WaitForSingleObject和WaitForMultipleObjects接口的问题。 在我的应用程序中,我产生了多个线程,其中所有线程都等待来自父进程的事件,或者每t秒周期运行一次。 我已经检查了pthread_cond_timedwait ,但是我们必须为此指定绝对时间。 我怎么能在Unix中实现这个?

OpenSSL和multithreading

我一直在阅读有关如果在multithreading应用程序中使用OpenSSL的要求,您必须使用OpenSSL注册一个线程标识函数(以及一个互斥体创build函数)。 在Linux上,根据OpenSSL提供的例子,一个线程通常是通过注册一个这样的函数来标识的: static unsigned long id_function(void){ return (unsigned long)pthread_self(); } pthread_self()返回一个pthread_t,这在Linux上可行,因为pthread_t只是一个unsigned long的typedef。 在Windows pthreads,FreeBSD和其他操作系统上,pthread_t是一个结构体,结构如下: struct { void * p; /* Pointer to actual object */ unsigned int x; /* Extra information – reuse count etc */ } 这不能简单地转换为无符号长整型,当我尝试这样做时,会抛出一个编译错误。 我尝试了void * p并将其转换为无符号长整型,理论上内存指针应该在线程间是一致且唯一的,但是这只会导致我的程序崩溃。 当使用Windows pthreads或FreeBSD或任何其他类似的操作系统时,我可以使用OpenSSL注册哪些线程识别function? 另外,还有一个问题: 有谁知道这是否也需要完成,如果OpenSSL编译进去,并与QT一起使用,如果是的话如何注册与OpenSSL的QThreads? 令人惊讶的是,我似乎无法在QT的文档中find答案。

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相同。 […]