如何使C包装API线程安全?

首先,一些有关上下文的设置/信息。我正在用C写一个API,该API环绕了利用IUF(Initialize(),Update(),Finalize())函数的C校验和API。

我的API包含一个函数,我们将其称为foo(),该函数将输入结构指针作为参数。它的编写方式是,可以以块/块而不是整个数据缓冲区的形式提供要散列的数据。此代码将在资源非常有限的嵌入式系统上运行,因此能够分块读取文件以对数据进行哈希处理是此API的特定目的。使用单个功能不是我的选择,而是必要条件。

int foo(struct_t*);

而struct_t看起来像这样。

{
   char* data,
   int dataLen,
   bool finalBlock,
   char checksum[CHECKSUM_SIZE]
}

基本上,foo()的调用者每次调用该函数时,都会在下一个数据块以及相应数据的大小中填充“ data”和“ dataLen”参数,直到将数据完全提供给foo()为止。不幸的是,“ finalBlock”参数是告诉foo()您正在提供要处理的最终数据块的唯一方法。对于用例,这是可以理解的。

现在到了真正的问题。内部IUF校验和API具有自己的唯一数据结构,不允许将其公开给foo()的调用者。由于我们现在仅在一个线程中使用foo(),因此当前的解决方案是使IUF API的结构(我们称之为bar)成为静态变量。这使得foo()函数不是线程安全的。

int foo(struct_t* x)
{
   /*Struct required by IUF API*/
   static bar y = {0};
   int retCode = 0;
   /*rest of code that processes data as needed*/
   ...
   /*after finalizing checksum and storing in x, reset y*/
   return retCode;
}

我想尽可能使foo()成为线程安全的,而不会将'bar'结构暴露给foo()的调用者。有什么建议?

TL; DR:具有一种具有一个功能的API,该功能需要多次调用才能完成工作。必须向此API的调用者隐藏内部结构,但该结构必须保留到API完全完成为止。当前将该结构设置为静态变量,以便在API完成之前一直存在,但这会使我的API线程不安全。请帮助。