Articles of multithreading

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

我需要与多个线程同时访问一个文件。 这需要同时完成,没有线程序列化出于性能原因。 该文件特别是用“临时”文件属性创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时使用它? 或者,如果线程中断,还有什么其他的方式可以安排我等待呢?

内存映射文件是线程安全的

我想知道是否可以通过使用内存映射文件对单个文件执行multithreading写入,并确保两个线程不写入同一区域(例如,通过交错固定大小的logging),从而减less了同步在应用程序级别,即不使用我的代码中的关键部分或互斥体。 但是,经过Google的search,我还是不确定。 来自微软的这个链接说: 首先,资源明显节省,因为两个进程共享内存的物理页面和用于支持内存映射文件的硬盘存储页面。 其次,只有一组数据,所以所有的观点都是一致的。 这意味着通过一个进程的视图对内存映射文件中的页面进行的更改会自动反映到另一个进程的内存映射文件的公共视图中。 本质上,Windows NT不需要做任何特殊的簿记来确保数据对两个应用程序的完整性。 但它是否适用于属于同一进程的线程? 这将是合理的(因为我的写作是不相交的),但是我不太了解内存映射的底层实现(例如,操作系统要做什么)。 示例用例,其中myFunction由每个线程执行: // crt – index of current thread, in 0..n-1 // n – thread count // memArea – pointer to memory location obtained from mapping a file void myFunction(int crt, int n, int*memArea){ for (int i=1; i<512; i++) memArea[ ( sizeof(int)*( n*i + crt ) […]

延迟初始化caching…如何使其线程安全?

这就是我所拥有的: 一个Windows服务 C# multithreading 该服务使用Read-Write-Lock(一次多次读取,写入其他读/写线程的块) 一个简单的,自写的DB C ++ 足够小,以适应内存 足够大,不想在启动时加载它(例如10GB) 阅读performance非常重要 写作不那么重要 树结构 树节点中保存的信息存储在文件中 为了获得更快的性能,文件仅在第一次使用和caching时加载 延迟初始化,以加快数据库启动 由于数据库会经常访问这些节点信息(每秒数千次),而且由于我不经常写这些信息,所以我想使用某种双重检查的locking模式。 我知道在这里有很多关于双重检查locking模式的问题,但似乎有这么多不同的意见,所以我不知道什么是最适合我的情况。 你会怎么做我的设置? 这是一个例子: 一百万个节点的树 每个节点存储一个键值对的列表(存储在一个文件中用于保存,文件大小为10kB) 当第一次访问一个节点时,这个列表被加载并存储在一个映射中(像std :: map那样) 下次访问这个节点时,我不必再次加载文件,我只是从地图上获取它。 唯一的问题是:两个线程第一次同时访问节点,并想要写入caching映射。 这是不太可能发生的,但这不是不可能的。 这是我需要线程安全的地方,不需要太多的时间,因为我通常不需要它(特别是一旦整个DB在内存中)。

如何获得Win32的内核数量?

我在Windows上编写一个程序,需要运行尽可能多的线程作为可用的核心。 但是我不知道如何获得核心的数量。 有任何想法吗?

什么是最好的方式来在Win上分叉/线程的PHP?

我有一个PHP脚本,检查(千)网站上的更新。 有时候(随着网站数量的增加,频率越来越高),我在其中一个站点的更新上遇到了执行超时,而整个脚本就会消失。 我能想到的最好的想法是分叉每个更新,所以如果它死了,整体更新只是继续。 从我看来,似乎PHP线程是不能依赖的,特别是在Windows平台(我不得不努力)。 我想过使用curl作为分叉机制,但是对于服务器(在时间和处理能力方面)是不是会花费更多的代价呢? 我很乐意听到关于PHP分叉/线程的一些想法和经验… 谢谢,奥默。

我怎样才能从一个单独的线程处理窗口消息?

我希望启动一个单独的线程来处理窗口消息(通过阻塞的GetMessage循环),但是仍然在初始线程中创build窗口。 在单独的线程中,只要它启动,我就用PM_NOREMOVE调用PeekMessage来确保消息队列的存在(是否有必要?),然后.. AttachThreadInput(initial thread id,GetCurrentThreadId(),true) ..最后进入消息循环 我还没有使用互斥体或cs来确保这是及时发生的,但是为了简单起见,我仅仅在最初的线程中使用了一个Sleep语句。 无论如何,窗口消息似乎不被单独的线程拦截。 我有些不确定我是否正确地做了这件事,并且希望得到任何可能的指导。 两个线程都在同一个进程中 谢谢你们

在Windows中join相当于

我如何等待一个线程在Windows中死亡? 这就是我想我的代码看起来像: main thread: creating thread: thread1 waiting for thread1 to die //rest of the code 我正在使用Win32 API。

在Linux上工作的线程限制与networking/ IO绑定应用程序的进程相比有什么限制?

我听说在linux下的多核服务器上,当你只有一个进程但是multithreading时,不可能达到最高性能,因为Linux对IO有一些限制,所以在8核心服务器上有8个线程的进程可能是比8个进程慢。 任何意见? 还有其他的限制,可能会减慢应用程序? 这些应用程序是一个networkingC ++应用程序,服务于100多个客户端,有一些磁盘IO。 更新:我担心除了我自己实现的锁之外,还有一些与IO相关的问题…在几个线程中执行simultaniousnetworking/磁盘IO没有任何问题吗?