Articles of multithreading

线程ID与线程句柄

一个尴尬的问题:线程ID和线程句柄有什么区别? 为什么都需要? Windows和Linux有什么不同?

在Windows下获取新线程/删除线程的通知

当你创build一个DLL时,你可以在DllMain函数(DLL_THREAD_ATTACH / DLL_THREAD_DETACH)中得到关于新线程/退出线程的通知。 有没有办法在(非托pipe)可执行文件中从Windows获取这些或等效的通知?

.NET或Windows同步基元性能规范

我目前正在撰写一篇科学文章,在那里我需要非常确切地引用。 有人可以指向我MSDN,MSDN文章,一些发表的文章来源或一本书,在那里我可以findWindows或.NET同步原语的性能比较。 我知道这些是在下降的性能顺序:互锁API,关键部分,.NETlocking语句,监视器,互斥体,EventWaitHandle,信号量。 非常感谢, Ovanes PS我发现了一本好书: Joe Duffy在Windows上的并发编程 。 本书是由.NET Framework的头部并发开发人员之一编写的,其内容非常精彩,有很多解释,如何工作或实现。

使c ++程序以交互方式将input输出传递给windows命令提示符

我想做一个简单的程序,并行地启动一个cmd.exe,并将用户的input作为一个命令,然后传递给cmd.exe,执行后我的程序应该从cmd.exe的输出,并显示它用户。 基本上是一个命令提示符的界面。 我不想使用像system()这样的方法,因为他们每次都启动一个cmd的新实例,而我不能像cd一样运行命令。 我试着用下面的代码来生成一个cmd并显示初始行(copyright ….),但是传递命令只是简单地返回相同的行。 #include <iostream> #include <windows.h> #include <process.h> using namespace std; DWORD WINAPI exec(LPVOID inputP){ char* input=(char*) inputP; HANDLE stdinRd, stdinWr, stdoutRd, stdoutWr; SECURITY_ATTRIBUTES sa = {sizeof(SECURITY_ATTRIBUTES), NULL, true}; STARTUPINFO si; PROCESS_INFORMATION pi; DWORD stuff; char buff[1000]; //Create the main transfer pipe if(!CreatePipe(&stdinRd, &stdinWr, &sa, 0) || !CreatePipe(&stdoutRd,&stdoutWr, &sa, 0)) { cout<<"Pipe […]

在Windows上使用C中的线程。 简单的例子?

我需要什么以及如何在Windows Vista上使用C中的线程? 你能给我一个简单的代码示例吗?

如何杀死Haskell中的一个线程

使用Control.Concurrent和forkIO有一些情况会导致线程处于阻塞状态(这在networking连接的windows下尤其频繁),所以即使尝试使用killThread,也不会在线程中引发exception。 有没有其他的方式来强制线程死亡? 我试图用helper线程退出整个应用程序,在这些情况下没有任何效果。 Glorious Glasgow Haskell编译系统,版本6.12.1 HP 2010.1.0.0 编辑:要清除的东西了,我不想终止应用程序,我宁愿杀死已经被阻止了很长一段时间的线程。 然而,即使在这里,也有很多例子,在辅助线程中使用exitWith的完整代码,并且这种scheme在我所拥有的条件下不起作用。

接收大量(r)卷的UDP通信时,CPU负载过高(Windows)

我正在研究使用大量传入数据进行进一步处理的应用程序(组播传输stream,具体而言)的问题。 情况如下:添加多个组播stream。 每个都有它自己的接收线程从套接字接收数据,然后将其复制到环缓冲区。 它不再做了。 在大约500至600兆位,一个特定的CPU核心达到100%。 实际上,在初始化stream时,随着以太网stream量的增加,我可以看到它几乎线性地爬向负载。 套接字代码使用WSA重叠的API。 即使当我减less线程来做到这一点(即不复制到环缓冲区,这反过来将主应用程序的任何负载减less到接近于零),我都可以很容易地将这个特定的内核陷入红色。 另外有趣的是,即使我通过关联设置将其限制在4个完全不同的核心上,该负载也存在于该特定核心上。 我最后得出的结论是在操作系统或驱动程序级别上花费了一些时间。 我已经尝试在拷贝之前一次收集n个数据报(即超过1500字节的MTU),但这只会让事情变得更糟。 我也检查了我的套接字configuration正确(非阻塞,返回值都可以)。 我想知道是否有人可以告诉我有关这个问题,也许有这个问题或有一些有用的见解,如何在Windows上有效地处理这些stream量。 (我正在使用的NIC:Intel PRO PT1000) UPDATE 我只设置了一个testing应用程序,只有一个目标:从任意数量的多播中获取传入的UDP。 我正在用Lenbuild议的IO完成端口策略来做这件事。 现在我可以很容易地从28个组播中获得1Gbit的CPU负载(毕竟现在我没有对数据包做任何处理),但是当使用更多(更小带宽)的组播时,一般在70以上,变得越来越糟糕,工作线程似乎不平衡,大多在浪费时间(等待)。 NIC中断负载现在不是限制因素(之前是这样)。 我对这个multithreadingnetworking资料很陌生。 工作线程只不过是在IO完成端口(GetQueuedCompletionStatusEx())/ INFINITE上等待,然后当stream读取完成时,我立即发出另一个循环(如果我可以在同一个stream上同时获得更多,我将采取那些没有发出新的IO事件,FILE_SKIP_COMPLETION_PORT_ON_SUCCESS)。 我拥有和CPU核心一样多的工作线程(任何事情都让事情变得更糟)。 没想到这个提出了一个新的问题 – 但是,再次,任何帮助非常感谢! 这是我的testing应用程序的来源。 (C ++) – 应该可读:-) http://pastebin.com/xWEPPbi6

multithreading应用程序崩溃,出现内存使用率高的错误R6016或0xC0000005

这是在Windows XP上使用MSVC2010在C ++中开发的基于multithreading控制台的应用程序。 该应用程序消耗大量的内存。 但是,当内存使用量达到2GB左右(Windows 32位内存限制)时,它会突然崩溃随机的地方与这些错误之一: R6016-线程数据空间不足 0xC0000005:访问冲突读取位置0x02030000 伴随着这个,在控制台“运行时错误”上也出现了很多次的string。 但不知道从哪里来(我的代码不打印它)。 不幸的是,没有确切的堆栈跟踪或位置可用的地方崩溃。 它只是崩溃的地方,尤其是当内存使用量约2GB。 我会期望CRT无法分配内存时返回错误或失败。 在这种情况下,我已经确定应用程序将运行平稳。 但是,为什么在这个地球上它显示的信息框中带有这些导致退出应用程序的错误。 我在这方面挣扎了好多天,现在真的很难忍受。 我试过了: 1)通过debugging器知道代码中崩溃的位置。 但它只是在任何地方崩溃。 例如,大部分在新的内存分配调用类似于: char* ptr = new (std::nothrow) char[1024]; 正如我们所看到的,没有任何应用程序在这里崩溃的理由。 2)缩小代码path,find崩溃的确切场景:我也无法成功。 作为一种解决方法,我认为不要触摸我的应用程序的内存使用2GB。 但是后来出现了一个问题:“即使在低内存使用情况下,它也不会崩溃,这可能只是时间问题呢? 另外,还没有确切的方法来事先知道可以分配多less精确的内存 。 我真的用尽了这个bug,迫切需要帮助/指导。 更新: 我缩小了这是QueueUserWorkItem (将工作项QueueUserWorkItem线程池中的工作线程的Windows函数)的问题。 当调用没有内存的情况下,它会导致线程内的内存分配失败,并出现“运行时错误”。不幸的是,我不能在这里再现这个崩溃的示例代码,因为我通过第三方库调用该函数,它是非常很难从代码中提取代码来进行演示。 但是为了解释,我调用了函数(带有标志WT_EXECUTELONGFUNCTION ),当它完成时,它会从我调用它的地方调用callback(以便它可以处理下一个工作项目)。 作为一种解决方法,我试图把检查应用程序(“私人字节”)的内存使用情况,而不是让它触摸2GB。 希望它应该工作。

Linux如何处理线程和进程调度

我想了解linux如何处理进程调度和线程调度。 我读过linux可以调度进程和线程。 我的问题是:Linux有一个线程调度程序和一个进程调度程序? 如果是,他们如何合作?

Windows Server 2003中的最大线程数是多less?

有人知道吗? 而更大的问题是当你遇到这个最大值时会发生什么? 这与其他Windows操作系统,如Vista,XP等相同的数字?