在移植linphone代码时,发现在注册SIP账号时,经常报如下错误:

There is no object pool created in thread [xxxxx].Use belle_sip_object_pool_push() to create one. Unowned objects not unref'd will be leaked.

经过调试发现是pthread_getspecific和pthread_setspecific出现了问题,原来想我只设置了一次pthread_setspecific,而发现有时pthread_getspecific获取的值是不一样的,当获取到得值为NULL,则报如上错误;而在其中我并没有进行pthread_key_delete和pthread_setspecific操作,为何相同key下,pthread_getspecific获取的值不一样呢?

仔细阅读了 thread-specific data management,发现这是一个线程局部存储,即同一线程内使用的,不同线程是不一样的,因此我将注册SIP账号放在主线程,就OK.

TLS

线程局部存储TLS即Thread Local Storage,顾名思义即线程内部数据,大家都知道在同一进程下的线程是共享内存地址的,而当希望线程内部需要保存自己的数据,则可以使用线程内部数据.

大家想想,在没有TLS之前,线程内不同函数需要共享内存,则一般使用全局变量和静态变量,全局变量和静态变量的引入必然会破坏封装性,于是个人认为引入TLS最主要的好处应该是保证封装性