gpt4 book ai didi

C 库从 BG 线程调用 kdb 函数

转载 作者:行者123 更新时间:2023-11-30 17:00:39 25 4
gpt4 key购买 nike

我有一个外部 C 库,用于通过后台线程上的回调函数异步消耗数据;我想接收数据并在 q 进程中处理它。以下代码.kx.com 的 Interfacing with C在文档中,我制作了一个小型的胶水代码 C 库,将入站源数据转换为 k 结构,并将其分派(dispatch)到我的 q 进程 vi sd1/sd0 调用,以便在 q 的线程上下文上调用 q 函数。程序成功调用初始回调然后挂起。

我已经将程序精简到我认为的最低限度,以简单地演示 C BG 线程回调到 q 函数,但我不确定我是否精简得太多。例如,sd1 接受 FD 和 C 回调。我的最小 FD 是通过 eventfd() 创建的,用于后续 sd1/sd0 调用。我尝试过在 FD 上调用读取和写入,并且不对 FD 执行任何 IO,无论哪种方式程序都会挂起。

这是我的基本 C 库:

/* testlib.c */
#define KXVER 3
#include "k.h"
#include <pthread.h>
#include <sys/eventfd.h>
I d;
pthread_t tid;
K qdisp(I d)
{
K ignored = k(0, (S)"onCB", kj(54321), (K)0);
sd0(d);
return (K)0;
}
void* loop(void* vargs)
{
while(1) {
sleep(1);
sd1(d, qdisp);
}
return NULL;
}
K init(K ignore)
{
d = eventfd(1, 0);
int err = pthread_create(&tid, NULL, &loop, NULL);
return (K)0;
}

这是调用它的 q 脚本:

/ testlib.q
init:`testlib 2:(`init;1)
onCB:{ 0N!x }
init[`blah]

任何提示或评论表示赞赏。

最佳答案

对于那些感兴趣的人来说,看起来 sd1 会安排一个函数在每次文件描述符上有可读取的数据时调用,而 sd0 会从调用中删除预定的函数。

所以想法是编写一个尝试从 FD 读取的函数;如果成功,则通过 k() 调用 q 函数并返回结果,如果 0 则返回 0,如果错误则调用 sd0。

#define KXVER 3
#include "k.h"
#include <pthread.h>
#include <sys/eventfd.h>
#include <stdio.h>
I d;
pthread_t tid;
K qdisp(I d)
{
J v;
if (-1 != read(d, &v, sizeof(J)) ) {
return k(0, "onCB", ki(v), (K)0);
}
sd0(d);
return (K)0;
}
void* loop(void* vargs)
{
J j = 0;
sd1(d, qdisp);
while(j++) {
sleep(1);
write(d, &j, sizeof(J));
}
return NULL;
}
K init(K cb)
{
d = eventfd(1, 0);
int err = pthread_create(&tid, NULL, &loop, NULL);
return (K)0;
}

关于C 库从 BG 线程调用 kdb 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37469977/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com