了解最新技术文章
有时,您需要向环境注册一个名称,例如跨进程共享的命名互斥体、Win32 用户定义的消息或用于共享内存支持的文件名。实际上,今天我们艰难地发现 Objective C 类名也属于这一类,因为它们通过名称向进程范围的共享运行时注册自己。
很容易想出一个好听的名字,比如tc_shared_mem.bin
文件支持的共享内存。它使调试变得容易,因为当看到名称时您就明白它是什么。尽管这个名字是全球性的,但如果有人使用相同的名字,这似乎是一个可怕的巧合,对吧?直到它发生。
谁最有可能重复使用这个名字?你!您的程序可能会偶尔更新一次,并且新代码可能包含一些相同的名称。如果你幸运的话,那也没关系。如果你不走运(我们的例子就是 Objective-C 类),就会发生严重破坏。
当然,您可以开始将版本号混合到名称中以防止此类问题。然后希望没有人会忘记在重新编译时增加版本 - 即使在开发过程中也是如此。
但也许冲突甚至不需要不同的版本。如果同时运行的程序的两个实例已经导致名称冲突怎么办?或者当程序重新启动时重新使用剩余的临时文件?或者temp
目录被错误配置为在用户之间共享?
在 think-cell,我们默认使用不同的理念。名称必须不同,除非它们必须相同:
如果该名称仅在程序的一个实例内共享,则当程序启动时,该名称将在运行时生成为随机字符串。
如果共享内存由同一程序的不同实例共享,您可能仍然不希望确保程序不同版本之间的兼容性。因此,它的名称在编译时生成为随机字符串,并且每次编译运行都会生成一个不同的名称。
即便如此,您真的希望共享内存在共享同一台机器的不同用户之间共享吗?跨不同桌面?也许将用户或桌面 ID 混合到名称中实际上是正确的。
无论如何,默认情况下使名称不同将迫使您考虑真正想要的共享级别,并防止名称在同一命名空间中意外相遇时出现意外情况。
24小时免费咨询
请输入您的联系电话,座机请加区号