Articles of multithreading

C ++ – Sleep()和cin如何工作?

只是好奇。 Sleep()函数实际上是如何工作的(在windows.h中声明的)? 也许不仅仅是这个实现,而是任何人。 我的意思是 – 它是如何实现的? 如何使代码在特定时间“停止”? 也好奇cin >>和那些实际上工作 。 他们究竟做了什么? 我知道如何“阻止”继续运行的唯一方法是使用while循环,但是考虑到这与处理从stdin读取方法时发生的情况相比,需要大量的处理能力(只是比较一段时间(真正)从标准input读取),我猜这不是他们做的。

CString在内核中与HeapWalk和HeapLock / HeapUnlock死锁结合使用

我的目标是locking为我的进程堆分配的虚拟内存(以防止将其交换到磁盘的可能性)。 我使用下面的代码: //pseudo-code, error checks are omitted for brevity struct MEM_PAGE_TO_LOCK{ const BYTE* pBaseAddr; //Base address of the page size_t szcbBlockSz; //Size of the block in bytes MEM_PAGE_TO_LOCK() : pBaseAddr(NULL) , szcbBlockSz(0) { } }; void WorkerThread(LPVOID pVoid) { //Called repeatedly from a worker thread HANDLE hHeaps[256] = {0}; //Assume large array for the sake […]

从线内分叉是否安全?

让我解释一下:我已经在Linux上开发了一个应用程序,它分叉和执行外部二进制文件并等待它完成。 结果由fork +进程独有的shm文件传递。 整个代码封装在一个类中。 现在我正在考虑线程化,以加快速度。 具有许多不同的类函数实例,并发地(使用不同的参数)分离和执行二进制文件,并与自己的独特的shm文件交stream结果。 这个线程安全吗? 如果我在一个线程内分叉,除了安全之外,还有什么我需要注意的吗? 任何意见或帮助,非常感谢!

在C ++中传递函数指针

我想做这个简单的代码工作。 #include <iostream> #include <windows.h> void printSome (int i) { std::cout << i << std::endl; } void spawnThread (void (*threadName)(int i)) { CreateThread ( 0, // default security attributes 0, // use default stack size (LPTHREAD_START_ROUTINE)threadName, // thread function name (LPVOID)i, // argument to thread function 0, // use default creation flags 0 // returns […]

如何修改正在使用的DLL?

如果我有同一个进程的多个实例访问某个DLL,有没有办法让这些进程之一获得它的锁,删除它,replace它,并继续?

将多个OpenGL窗口同步到vsync

在Windows应用程序中,我有多个OpenGL窗口同时打开。 理想情况下,我希望每个都以60 fps进行绘制,同步到屏幕刷新。 对于每个渲染上下文,我调用wglSwapIntervalEXT(1)打开wglSwapIntervalEXT(1) 。 每个窗口都有自己的显示线程,它绘制框架,然后调用SwapBuffers进行更新。 事实certificate,这些窗口正在相互“搏斗”:看起来SwapBuffers调用是同步的,并且彼此等待,即使它们在不同的线程中。 我正在测量每个窗口的帧到帧时间和两个窗口,这将下降到30 fps,三到20 fps等。 如果我使用wglSwapIntervalEXT(0)closureswglSwapIntervalEXT(0) ,无论打开多less个窗口,都可以以60 fps的速度快速刷新。 但是打开一个窗口,这并不像打开vsync那样顺畅。 有没有办法用OpenGL来实现我想要的?

为什么我不需要在COM线程中创build的线程中调用CoInitialize?

为了学习multithreading,我在COM线程( TRemoteDataModule )中创build了一个线程。 这是我的组件工厂: TComponentFactory.Create(ComServer, TServerConn2, Class_ServerConn2, ciMultiInstance, tmApartment); 在线程内部,我不需要调用CoInitialize来使用TADOQuery.Create , .Open … .Exec 我读过, 我需要在线程上初始化COM库,然后再调用除CoGetMalloc之外的任何库函数,以获得指向标准分配器的指针和内存分配函数。 但在这种情况下,CoInitialize的缺席并没有带来任何麻烦。 这与线程模型有关吗? 我在哪里可以find这个问题的解释? 更新: 当我说INSIDE时,它意味着在COM方法上下文中: interface type TWorker = class(TThread); TServerConn2 = class(TRemoteDataModule, IServerConn2) public procedure Method(); safecall; end; implementation procedure TServerConn2.Method(); var W: TWorker; begin W := TWorkerTread.Create(Self); end; 更新2: 用于连接数据库的TADOConnection当前正在COM线程上下文( TThread.Create constructor )中创build。 虽然TADOConnection.Open和TADOQuery.Create/.Open都在TThread.Execute中执行。 更新3 – Simulacrum […]

使用多个线程访问单个文件

我需要与多个线程同时访问一个文件。 这需要同时完成,没有线程序列化出于性能原因。 该文件特别是用“临时”文件属性创build的,它鼓励Windows将文件保存在系统caching中。 这意味着大部分时间文件读取不会靠近磁盘,而是从系统caching中读取文件的一部分。 能够同时访问这个文件将显着提高我的代码中某些algorithm的性能。 所以,这里有两个问题: 是否有可能从不同的线程同时访问相同的文件? 如果是这样,你如何提供这种能力? 我已经尝试创build临时文件并再次打开文件以提供两个文件句柄,但第二次打开不成功。 这是创build: FFileSystem := CreateFile(PChar(FFileName), GENERIC_READ + GENERIC_WRITE, FILE_SHARE_READ + FILE_SHARE_WRITE, nil, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL OR FILE_FLAG_RANDOM_ACCESS OR FILE_ATTRIBUTE_TEMPORARY OR FILE_FLAG_DELETE_ON_CLOSE, 0); 这是第二次打开: FFileSystem2 := CreateFile(PChar(FFileName), GENERIC_READ, FILE_SHARE_READ, nil, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL OR FILE_FLAG_RANDOM_ACCESS OR FILE_ATTRIBUTE_TEMPORARY OR FILE_FLAG_DELETE_ON_CLOSE, 0); 我已经试过各种组合的标志,迄今为止没有成功。 第二个文件打开总是失败,消息的影响是文件无法访问,因为它正在被另一个进程使用。 编辑: 好,还有更多的信息(我希望不要迷失在这里的杂草里) 有问题的进程是在WinXP 64上运行的Win32服务器进程。它维护着大型的空间数据库,并希望在L1 / L2caching结构的内存中尽可能多地保留空间数据库。 L1已经存在。 L2作为一个“临时”文件存在,保留在windows系统caching中(这是一个肮脏的伎俩,但绕过win32的内存限制)。 […]

multithreading单读写器单写FIFO队列

我需要一个队列来传递消息从一个线程(A)到另一个(B),但是我找不到一个真正做我想做的事情,因为他们通常允许添加一个项目失败,在我的情况下因为消息需要处理,所以非常致命,线程真的不能停下来等待空闲的空间。 只有线程A添加项目,只有线程B读取它们 线程A不能阻塞,但是线程B不是性能关键的,所以它可以 添加项目必须总是成功,所以队列不能有一个大小上限(系统内存不足) 如果队列是空的,线程B应该等待,直到有一个项目要处理

使用JNA原生等待调用检测线程中断(Windows)

我试图写一些通过JNA执行等待的代码(例如通过调用Kernel32函数WaitForSingleObject),但是如果调用Thread.interrupt(),我还想等待完成。 我假设Java使用类似Event对象来实现中断; 有什么办法从Java获取事件,以便在调用WaitForMultipleObjects时使用它? 或者,如果线程中断,还有什么其他的方式可以安排我等待呢?