考虑像localtime
C 标准库中返回指向(历史上)静态缓冲区的指针的函数。C11 是否使这些缓冲区成为线程本地的?
根据 C11 中的 7.1.4:
除非在随后的详细描述中另有明确说明,否则库函数应防止数据竞争,如下所示: 库函数不得直接或间接访问可由当前线程以外的线程访问的对象,除非通过函数的参数直接或间接访问对象. 库函数不得直接或间接修改当前线程以外的线程可访问的对象,除非这些对象是通过函数的非常量参数直接或间接访问的。如果对象对用户不可见并且受到保护以防止数据竞争,则实现可以在线程之间共享它们自己的内部对象。
例如考虑localtime
。它的struct tm
返回值指向的 似乎不符合“内部对象”的条件,因为调用者可以访问它,因此似乎localtime
在另一个线程中的调用可能不会破坏先前在第一个线程中返回的结果。这意味着localtime
需要为每个线程使用不同的缓冲区。
但是,标准没有指定返回地址的对象的生命周期结束,而且我认为没有理由在调用线程终止后继续使用它的程序struct tm
是无效的。因此,对象不能具有线程存储持续时间。
我发现实现可以满足所有要求的唯一方法是到处泄漏内存,这肯定不是预期的。我是否遗漏了一些明显的东西,或者 C11 对遗留接口的线程安全处理真的考虑得不好?