首先,一些有关上下文的设置/信息。我正在用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线程不安全。请帮助。