从许多线程写入文件

时间:2010-12-16 23:09:45

标签: multithreading winapi

我有一个问题。 我的progrem在系统中创建了一些进程(Windows)。 他们都必须在磁盘上的一个文件中写入一些数据。 所以,我需要同步它们......但不知道...... 确切地说:我的程序调用SetWindowsHook并在许多进程中注入一个dll。他们都需要将一些数据写入一个文件

6 个答案:

答案 0 :(得分:2)

跨进程工作的同步对象是互斥锁。

答案 1 :(得分:1)

Windows有一个锁定foreach文件,因此如果一个进程正在写入文件窗口,则不要让另一个写入。 Mutex就是你想要的,保护你用一个写入文件的代码。

答案 2 :(得分:1)

单一系统正如David所说,您可以使用互斥锁来完成此任务。在Windows中,这是通过使用命名的互斥锁和(如果需要)命名信号量来完成的。

函数CreateMutex可用于创建互斥锁(通过第一个进程)并通过其他进程打开它。在所有流程中提供相同的lpName值。使用WaitForSingleObject获取互斥锁的所有权。并使用ReleaseMutex放弃所有权。

创建命名互斥锁can be found here的示例。

如果使用命名信号量,您可以通过给信号量初始计数为1来完成相同的事情。使用CreateSemaphore创建并打开它,WaitForSingleObject以获得所有权(与mutex)和ReleaseSemaphore放弃拥有权。

多个系统上述方法假设这些进程都在同一系统上运行。如果进程在不同的系统上运行,那么您可能需要使用DVD提到的想法。您可以锁定文件的某些部分并将其用作同步方法。例如,按照惯例,您可以将某个偏移量锁定1个字节(甚至可以超过文件末尾)作为一种信号量。但是,使用此机制可能意味着您需要根据所使用的功能实现某种有效的等待。如果您使用CreateFileLockFileEx,则可以让该功能通过在呼叫中不指定LOCKFILE_FAIL_IMMEDIATELY来执行阻止等待。

答案 3 :(得分:0)

您的问题的答案是实现线程同步。

如果您使用的是C#,则可以在文件编写代码上添加一个锁{}语句。

对于其他语言,您必须使用Monitor或Mutex类进行同步。

答案 4 :(得分:0)

使用Stream.Synchronized()http://msdn.microsoft.com/en-us/library/system.io.stream.synchronized.aspx。此方法仅适用于C#,

答案 5 :(得分:0)

我最近不得不做几乎这样的事情(从注入到多个进程的dll中记录单个文件)。

使用_fsopen()在每个进程中打开文件,然后使用mutex进行同步,以确保一次只有一个进程写入文件。