Articles of multithreading

我需要一个消息泵,不会弄乱我打开的窗口

我的应用程序(我正在使用的安装程序的引导程序应用程序需要启动一些其他应用程序(我的安装程序和第三方安装程序的安装程序的先决条件),并等待它们完成。为了允许GUI执行屏幕更新在等待一个应用程序完成的时候,我使用Visual Studio文档中关于空闲循环处理的'兼容MFC'的例子,在等待循环中放置了一个消息泵作为指导。我的代码(在CWinApp的成员函数中派生类)如下: if (::CreateProcess(lpAppName, szCmdLineBuffer, NULL, NULL, TRUE, 0, NULL, NULL, &StartupInfo, &ProcessInfo)) { ::GetExitCodeProcess(ProcessInfo.hProcess, &dwExitCode); if (bWait) while (dwExitCode == STILL_ACTIVE) { // In order to allow updates of the GUI to happen while we're waiting for // the application to finish, we must run a mini message pump here to // allow messages […]

如何使用SleepEx的可靠警报和整体最低睡眠时间?

我有以下用例:我当前的线程需要执行operation1 ,等待一些时间与其他人协调,然后需要做operation2 。 在等待之间,由于文件系统事件,APC可能需要由该线程处理,在当前线程完成operation2之后,APC将稍后向另一个队列添加另一个operation1 。 简单的如下: while (true) { processOperation1; SleepEx(…, true); processOperation2; } 重要的是,在operation1和operation2之间,必须至less经过指定的SleepEx时间! 这不需要是一个整体,线程可以立即用于处理APC并排队另一个operation1 ,除非指定的时间已过,否则它不应该继续operation2 。 从文档 : 如果参数为TRUE,并且调用此函数的线程与调用扩展I / O函数(ReadFileEx或WriteFileEx)的线程相同,则函数在超时时间已过或I / O完成callbackfunction发生。 如果发生I / O完成callback,则调用I / O完成function。 如果一个APC排队到该线程(QueueUserAPC),则该函数在定时器溢出时间已过或调用APC函数时返回。 根据我的理解,这意味着如果SleepEx被调用并且APC已经排队,那么直接由当前线程执行,因为它有这个能力。 但是之后SleepEx之后的代码会发生什么? 线程是否返回到进程operation2是因为SleepEx返回了控制权还是线程回到睡眠状态,在SleepEx停留,直到经过指定的时间量? 文档中的第一句话并不是说从函数返回,而是“恢复线程”: 挂起当前线程直到满足指定的条件。 发生以下情况之一时,执行继续: 这可能意味着线程恢复,处理APC,然后停留在SleepEx ,hibernate所需的任何时间量。 如果情况并非如此,那么SleepEx是否真的离开了,这是否说明已经过了多长时间? SleepEx似乎没有提供该值,但只有一些不变的返回值。 这听起来像我需要在我自己的SleepEx之前和之后需要时间,并一次又一次地调用该函数,直到我真正需要的时间已经过去? 有没有像这样的东西,也许是作为boost一部分? 谢谢!

如何在c / c ++中asynchronous运行线程的特定函数?

性能调优:将数据写入多个pipe道 现在我正在做一个单一的线程: for(unsigned int i = 0; i < myvector.size();) { tmp_pipe = myvector[i]; fSuccess = WriteFile( tmp_pipe, &Time, sizeof(double), &dwWritten, NULL ); if(!fSuccess) { myvector.erase(myvector.begin()+i); printf("Client pipe closed\r\n"); continue; } fSuccess = WriteFile( tmp_pipe, &BufferLen, sizeof(long), &dwWritten, NULL ); if(!fSuccess) { myvector.erase(myvector.begin()+i); printf("Client pipe closed\r\n"); continue; } fSuccess = WriteFile( tmp_pipe, pBuffer, BufferLen, &dwWritten, […]

Windows的gcc端口thread_posixs和thread_win32之间的区别是什么?

我想下载适用于windows的最新版本的gcc 4.7.2编译器。 当我到了这个页面 ,我应该看到一个下载链接,我面对两个类别: 线程,POSIX 线程-win32的 这两个有什么区别? 它们只是线程实现吗?我的意思是它们只是在实现方式上有所不同,因此最终结果(类,如何使用它们等)保持不变。 还是他们强加一个特定的编码风格?

Visual C ++中的Pthreads

我在Windows中尝试multithreading,并想知道我是否应该 使用Win32 API 使用Windows的POSIX线程 如果我尝试在不同的平台上开发这样的应用程序,学习Pthreads将会很有用,但是如果不学习Win32 API,我会失去什么? 还是都是相似的,以便学习一个让我找出对方很容易?

在Windows上互斥,临界区等的成本

我在某处读到一个互斥量的开销并不多,因为上下文切换只发生在争用的情况下。 在Linux中也称为互斥体。 在Windows中相同的东西是否保持良好? Critical Section是关于Linux中互斥体的更贴图。 从我所收集的内容来看,临界区与Mutex相比提供了更好的最佳性能,对于每一种情况都是如此? 在Windows中是否存在互斥体比临界区快的情况? 假设只有一个进程 – 线程正在访问互斥体(只是为了消除关键部分的其他好处) 补充信息:OS的Windows服务器, 语言C ++

解决太多静态链接CRT的限制?

当通过LoadLibrary加载外部DLL(不在我们的控制下)时,我们遇到了一个问题,那些DLL中的静态链接CRT无法分配光纤本地存储。 这与mskb 193462类似,只是这是FLS,只有128个。 有没有什么有用的方法来解决这个问题? CRT使用GetProcAddressfindFlsAlloc无论如何(因为这显然从来没有在XP中),所以它甚至真的需要它? (这是在Vista中,其中FlsAlloc实际存在; DLL似乎使用MSVC8)

C ++套接字服务器 – 无法饱和CPU

我用C ++开发了一个小型的HTTP服务器,使用boost :: asio,现在我正在用多个客户端进行负载testing,而且我一直无法接近饱和CPU。 我正在testing一个Amazon EC2实例,使用一个cpu的50%,另一个cpu的20%,剩下的两个闲置(根据htop)。 细节: 服务器启动每个核心一个线程 请求被接收,parsing,处理,并且响应被写出 这些请求是针对从内存中读取的数据(只读用于此testing) 我使用两台机器“加载”服务器,每台机器运行一个Java应用程序,运行25个线程,发送请求 我看到大约230个请求/秒的吞吐量(这是应用程序请求,它由许多HTTP请求组成) 那么,我应该看看如何改善这个结果呢? 鉴于CPU大多是空闲的,我想利用这个额外的容量来获得更高的吞吐量,比如说800个请求/秒或者其他任何东西。 我有过的想法: 请求是非常小的,经常在几个毫秒内完成,我可以修改客户端发送/撰写更大的请求(也许使用批处理) 我可以修改HTTP服务器使用selectdevise模式,这是适当的吗? 我可以做一些分析,试图了解瓶颈是什么

在Windows中枚举线程

如何枚举进程中的所有线程(或进程ID)? 我对这样做感兴趣,所以我可以进一步在每个线程上做一个EnumThreadWindows 。

Windows上的C ++ 11线程

在MinGW中使用g ++ 4.5.2进行编译时,有没有办法在windows中使用std::thread和C ++ 11标准库? 我是gunna承认不,因为我已经看到很多事情说你必须编译与pthreads选项,但我想我会问无论如何。