我正在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++相关问答推荐

为什么下面的C代码会进入无限循环?

在没有动态内存分配的情况下,用C语言最快地将各种数组复制到单个较大的数组中

在编译时参数化类型定义

可以将C变量限制为特定的读/写速度吗?

为什么我不能只在内存地址中添加一个int来寻址任何数组?

X64:并发写入布尔数组

getline()从c中的外部函数传递指针时输出null

这个C程序在工作中途停止获取输入.我收到分段故障(核心转储).我还是不知道问题出在哪里

如何使用_newindex数组我总是得到错误的参数

S在本文中的价值观到底出了什么问题?

仅从限制指针参数声明推断非混叠

收到不兼容的指针类型警告,因为函数的返回不是空*,而是 struct 指针

Printf()在C中打印终止字符之后的字符,我该如何解决这个问题?

我正在try 将QSORT算法实现为C++中的泛型函数

STM32 FATFS用户手册(Um1721)中的代码正确吗?

在下面的C程序中,.Ap0是如何解释的?

程序如何解释变量中的值

`%%的sscanf无法按预期工作

无法理解 fgets 输出

如何转义包含指令中的字符?