从共享库C-api返回线程本地数据

时间:2018-01-07 10:22:20

标签: c++ multithreading c++11 api-design thread-local

问题1:从提供传统C-API的共享库返回指向thread_local数据的指针是否安全且可移植?

lib本身很自然地用C ++ 11实现。内存泄漏和竞争条件的安全性,主要桌面操作系统的可移植性:Windows,Linux和OSX。调用应用程序可能是例如native,Java,C#等。

用例是实现调用者友好和线程安全的例程,该例程从共享库返回数据。在这种情况下,后续调用将特别覆盖线程本地缓冲区,并且这个缺点优于要求调用者使用提供的库明确释放返回的数据" free_data()"功能

// For example as a return value:
const char* text = MYLIB_get_foo_info();

共享库保证返回的数据有效,直到最初从API接收数据的同一线程调用特定API函数,并且线程终止将使其无效(解除分配)。因此,数据的使用实际上仅限于单线程使用,并且如果API用户希望将数据与其他线程一起使用或存储以供以后使用,则必须在API函数调用者中获取它的值副本。线。

根据这个特定情况的定义,可以安全地假设在调用者读取数据期间不会使数据无效。这确实是非常强大的假设,它基于API的特殊性质及其非常有限的用途。如果出现某些需要,可以选择稍后添加不需要此假设的API的另一个版本。

问题2:是否保证当库用户(应用程序)线程终止时,TLS内存在此时被解除分配?

例如,如果返回的字符串是库中的静态thread_local std :: string。

我没有找到明确和直接的答案这个特定情况(从共享库中使用TLS)。

发现了两篇关于库API设计的好文章,但这些文章没有给出关于TLS的任何提示:

在使用Windows之前的C ++ 11之前,可以使用TlsAlloc(),但必须专门检查在加载lib之前创建的库调用程序线程。

问题3:我是否正确使用C ++ 11 thread_local,不再有这种问题?

https://msdn.microsoft.com/en-us/library/windows/desktop/ms686997(v=vs.85).aspx

0 个答案:

没有答案