【发布时间】:2011-06-02 10:14:29
【问题描述】:
像 FileStream.BeginWrite 这样的异步文件 IO 线程安全吗?如果不是,那么它需要用“SyncLock”包裹,这意味着它仍然阻塞线程。
【问题讨论】:
-
你能提供一个让你认为它不是线程安全的例子吗?
标签: .net file-io asynchronous filestream
像 FileStream.BeginWrite 这样的异步文件 IO 线程安全吗?如果不是,那么它需要用“SyncLock”包裹,这意味着它仍然阻塞线程。
【问题讨论】:
标签: .net file-io asynchronous filestream
FileStream.BeginWrite 已经启动了一个新线程来访问这些文件。您不需要在单独的线程上启动FileStream.BeginWrite(因为这将是线程中的线程)。另一方面,多个FileStream.BeginWrite 函数不应同时访问同一个文件。
【讨论】:
另外,如果资源被多个线程访问,这意味着它是一个共享资源,在c#中使用它们的资源很多。
【讨论】:
FileStream.BeginRead / BeginWrite 实现是异步的,但它们对重叠 I/O 的使用不是以线程安全的方式完成的。
可以看到BeginRead/BeginWrite不接受读/写文件位置作为参数,所以对其他线程的操作(如Seek)可能会导致读/写在错误的文件位置。
如果您仍然不相信,Microsoft 的 FileStream 实现明确指定“这不是线程安全的”。在BeginReadCore & BeginWriteCore 内的评论中。
底线:如果您需要线程安全的重叠 I/O,则必须将 P/Invoke 与 ReadFile / WriteFile 结合使用。
【讨论】: