VMware 虚拟化编程(8) — 多线程中的 VixDiskLib
发布日期:2021-06-30 10:09:15 浏览次数:3 分类:技术文章

本文共 1215 字,大约阅读时间需要 4 分钟。

目录

前文列表

多线程注意事项

如果你的应用程序是多线程实现,那么你应该将 VMDK 操作的请求串行化。通过 VixDiskLib_Open 获取的磁盘句柄 diskHandle 并不会绑定到单个线程,而是能够跨线程使用。也就是说,你可以在一个线程中打开磁盘,然后在其他线程中使用该磁盘的句柄来进行其他的磁盘操作,但前提是你 必须串行化磁盘操作请求否则在并发的场景中,必定会造成磁盘操作对象混乱的后果。

多线程中的 VixDiskLib

首先可以确定的是,VDDK 支持到多个 VMDK File 的并发 I/O。但存在着以下限制:

  • VixDiskLib_InitEx or VixDiskLib_Init 只能被每个进程中的主线程调用一次。

  • VixDiskLib_InitEx or VixDiskLib_Init 的回调日志函数参数不能指定为 NULL。VixDiskLib 提供的默认日志函数是线程非安全的。在多线程环境中,必须提供自己实现的的线程安全日志函数。

  • 在调用 VixDiskLib_Open 或 VixDiskLib_Close() 时,VDDK 会分别进行或取消多个 lib 库的初始化。这使得在多线程环境中,可能会导致一些需要初始化环境的 lib 库不能生效。EXAMPLE:这会使 diskhandle2 的某些磁盘操作失败。

Thread 1: VixDiskLib_Open ...... VixDiskLib_CloseThread 2: ................................... VixDiskLib_Open ...... VixDiskLib_Close

解决该问题的办法就是,使用一个指定的线程管理所有的 Open 和 Close 操作,而让其他的线程进行 Read 或 Writes 等操作。EXAMPLE:

Open/Close Thread:VixDiskLib_Open ...... VixDiskLib_Open ...... VixDiskLib_Close ...... VixDiskLib_Close ......(handle1)              (handle2)              (handle1)               (handle2)I/O Thread 1:(owns handle1)    VixDiskLib_Read ... VixDiskLib_Read ...I/O Thread 2:(owns handle2)                                VixDiskLib_Read ... VixDiskLib_Read ...

该图显示了两个独立 diskHandle 上的并发读取,需要注意的是,在同一个 diskHandle 上进行并发读取是不被允许的。

转载地址:https://is-cloud.blog.csdn.net/article/details/78302280 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:VMware 虚拟化编程(9) — VMware 虚拟机的快照
下一篇:VMware 虚拟化编程(7) — VixDiskLib 虚拟磁盘库详解之三

发表评论

最新留言

做的很好,不错不错
[***.243.131.199]2024年04月24日 01时29分42秒