|
|
1
11
既然您的对象是线程本地的,为什么您需要锁定来保护它们呢?调用getInstance()的每个线程都将独立于任何其他线程,那么为什么不检查该singleton是否存在,并在需要时创建它呢?只有当多个线程试图访问同一个单例时才需要锁定,这在您的设计中是不可能的,正如上面所述。 编辑: 接下来是另外两个问题…我不明白为什么使用tlsalloc/tlsgetvalue等不能如您所期望的那样工作。因为保存指向singleton的指针的内存只能被相关线程访问,所以延迟初始化它不会有任何问题。但是没有明确的回调接口来清理它们。 最明显的解决方案是让所有线程主函数调用一个方法来清除创建的单例(如果有的话)。 如果线程很可能会创建一个singleton,一个更简单的模式可能是在线程主函数的开头创建singleton,然后在末尾删除它。然后,您可以通过在堆栈上创建单例来使用raii,或者将其保存在std::auto_ptr<gt;中,以便在线程结束时将其删除。(除非线程异常终止,但如果发生这种情况,所有的赌注都将被取消,并且泄漏的对象是您的问题中最小的一个。)然后,如果线程的大部分功能都在一个类中,您可以绕过单例,或者将其存储在TLS中,或者将其存储在类的成员中。 |
|
|
2
4
看一看 this paper 理解为什么双重检查锁定一般不起作用(即使在特殊情况下也可能起作用)。 |
|
|
3
1
我们使用一个存储线程ID到数据的映射的类来实现我们的线程本地存储。这似乎工作得很好,然后这个类的一个实例可以放在任何需要线程本地存储的地方。通常,客户端将的实例用作静态私有字段。 这是代码的大致轮廓
然后将其用作
这很简单,可以在任何可以获取线程ID的平台上工作。注意,关键部分仅用于返回/创建引用,一旦获得引用,所有调用都在关键部分之外。 |
|
|
user107586 · 如何处理等待句柄不会导致无限循环? 1 年前 |
|
|
ron burgundy · 获取-释放语义是否跨线程传递?[副本] 1 年前 |
|
|
BenjiFB · C#内存缓存:在一次操作中追加到列表? 1 年前 |
|
|
András Takács · Python多线程问题 1 年前 |
|
|
András Takács · Python多线程错误 1 年前 |