【发布时间】:2020-09-02 10:16:33
【问题描述】:
字符串获取器和设置器。如何使线程安全
【问题讨论】:
标签: multithreading com locking atl
字符串获取器和设置器。如何使线程安全
【问题讨论】:
标签: multithreading com locking atl
即使在单线程程序中,这也不会很好地结束。 getString 分发指向由strVar 管理的存储的指针。稍后的setString 调用可能会导致字符串重新分配其存储空间,从而使该指针悬空。任何挂在这个指针上并在以后尝试使用它的客户端都会触发未定义的行为。
线程会使这个问题变得更糟。假设有人在一个线程上调用getString。有可能另一个线程调用setString 并在getString 返回它之后和它的调用者有机会实际使用它之前使指针无效。在getString 内加锁无济于事。您需要返回共享状态的副本,而不是指向相同状态的指针。
是的,读取和写入需要同步。仅使用锁保护写入是不够的 - 两者都必须在锁下发生,否则会出现数据竞争。
【讨论】:
getString 目前的设计方式。它将指向共享数据的指针传递给调用者,调用者别无选择,只能在锁之外不受保护地访问它。