经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 程序设计 » C » 查看文章
muduo-ThreadLocal实现细节——阻止销毁未定义对象
来源:cnblogs  作者:从此寂静无声  时间:2018/11/2 9:15:57  对本文有异议

muduo利用pthread_key_t实现ThreadLocal模板类.

具体代码如下所示:

  1. 1 template<typename T>
  2. 2 class ThreadLocal : noncopyable
  3. 3 {
  4. 4 public:
  5. 5 ThreadLocal()
  6. 6 {
  7. 7 MCHECK(pthread_key_create(&pkey_, &ThreadLocal::destructor));
  8. 8 }
  9. 9
  10. 10 ~ThreadLocal()
  11. 11 {
  12. 12 MCHECK(pthread_key_delete(pkey_));
  13. 13 }
  14. 14
  15. 15 T &value()
  16. 16 {
  17. 17 T *perThreadValue = static_cast<T *>(pthread_getspecific(pkey_));
  18. 18 if (!perThreadValue)
  19. 19 {
  20. 20 T *newObj = new T();
  21. 21 MCHECK(pthread_setspecific(pkey_, newObj));
  22. 22 perThreadValue = newObj;
  23. 23 }
  24. 24 return *perThreadValue;
  25. 25 }
  26. 26
  27. 27 private:
  28. 28
  29. 29 static void destructor(void *x)
  30. 30 {
  31. 31 T *obj = static_cast<T *>(x);
  32. 32 typedef char T_must_be_complete_type[sizeof(T) == 0 ? -1 : 1];
  33. 33 T_must_be_complete_type dummy;
  34. 34 (void) dummy;
  35. 35 delete obj;
  36. 36 }
  37. 37
  38. 38 private:
  39. 39 pthread_key_t pkey_;
  40. 40 };

 

代码除destructor均较为容易理解,故对此进行解释:

  1. 1 static void destructor(void *x)
  2. 2 {
  3. 3 T *obj = static_cast<T *>(x);
  4. 4 //对于只声明,未进行具体定义类型,例如A,sizeof(A)结果为0
  5. 5 //利用此特性,若T是未定义类型,则T_must_be_complete_type在编译期间会报错
  6. 6 typedef char T_must_be_complete_type[sizeof(T) == 0 ? -1 : 1];
  7. 7 //消除unused-local-typedefs编译错误提示
  8. 8 T_must_be_complete_type dummy;
  9. 9 //消除Wno-unused-parameter编译错误提示
  10. 10 (void) dummy;
  11. 11 delete obj;
  12. 12 }

 

PS:

如果您觉得我的文章对您有帮助,可以扫码领取下红包,谢谢!

 

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号