我正在try 在C中构建二进制格式和JSON之间的双向转换(以使映射可脚本化).我查看了13个C JSON解析器,发现只有2个具有我想要的所有功能.一种是LGPL,另一种使用回调.必须将我的代码放到一个单独的DLL中,这样我就不会将LGPL与专有代码混合在一起,这是一项复杂的工作,所以我会首先try 使用"回调API".

基于回调的API如下所示(经过大量编辑的代码):

typedef void *(*api_malloc_func)(void *ctx, size_t sz);
/* ... */
typedef struct {
    api_malloc_func malloc;
    /* ... */
} api_config_params;

typedef struct {
    int (* api_on_bool)(void * ctx, int boolVal);
    int (* api_on_int)(void * ctx, long long intVal);
    /* ...*/
    /* "user-defined data", passed to callbacks. */
    void * ctx;
} api_callbacks;

api_handle api_config(const api_callbacks * callbacks, const api_config_params * cfg);

api_status api_parse(api_handle hand, const unsigned char * json, size_t len);

但是我想要/需要的是,让这个API"看起来像"二进制API,是这样的:

typedef struct {
    api_malloc_func malloc;
    /* ... */
    /* "user-defined data" */
    void * ctx;
} api_config_params;

api_handle api_config(const api_config_params * cfg);

typedef enum api_type_t {
    api_type_bool,
    api_type_int,
    /* ... */
} api_type_t;

api_type_t api_peek_type(api_config_params* reader);

bool api_read_bool(api_config_params* reader, bool* boolVal);

bool api_read_int(api_config_params* reader, long long* intVal);

/* ... */

自从我最后一次用C/C++编写代码(我现在是一名"Java程序员")以来已经forever年了,所以我不知道如何包装基于回调/事件的API,使其成为"非回调/基于事件的",也就是"同步".

那么,我该怎么做呢?理想情况下,不会使代码不是线程安全的.这有可能吗?

注意:我想我可以让二进制API改为使用回调,但这会使它变慢,而且我只关心二进制API的速度,而不关心JSON API的速度.

推荐答案

我该怎么做?理想情况下,不使代码成为非线程安全的.这可能吗

使用基于回调的解析器,几乎没有空间直接在上面分层基于Pull的接口.控制流致力于读取输入和分派事件.回调的执行可能会花费任意长的时间并执行任意的工作,但您不能在那里运行Pull接口,因为解析器在回调返回之前不会到达下一项.

但是,您可以在第二个线程中运行基于Pull的API.使低级推解析器执行的回调函数将事件入队,以供其他线程使用.如有必要,使用具有固定容量的阻塞队列,以便低级解析器不能在高级拉式解析器之前获得超过固定数量的事件.所需的同步将带来一些开销,但不清楚这对您有多重要.没有什么特别的理由不能使其成为线程安全的,但这涉及到比已经描述的交互更多的考虑因素.

C++相关问答推荐

为什么内核使用扩展到前后相同的宏定义?

#If指令中未定义宏?

获取每个循环迭代结束时的当前时间

用C++实现余弦函数

是否需要包括<;errno.h>;才能使用perror?

在移动数组元素时获得意外输出

如何在不使用字符串的情况下在c中编写函数atof().h>;

将 struct 数组写入二进制文件时发生Valgrind错误

通过对一个大的Malloc内存进行切片来使用Malloc的内存片

一元运算符

在链表中插入一个值

窗口消息处理函数以某种方式更改了应保持不变的 int 变量的值

假设函数调用返回的 string(char *) 上有 free() 是否安全?

如何从文件中读取一长串数据?

用C程序读取.txt文件并解析,如何处理空字段

LLVM,预期指令?

C程序出现意外输出和分段错误

为什么在C语言中,自动关键字对于编译器的编写者很有用?

如何解释在Mac OS上调用proc_listpids函数的结果?

C语言整数乘除并将结果存储在整数或浮点数中时,精度丢失发生在何处以及如何避免?