想象一下这个场景,我有一个用 C 语言编写的适配器,用于将消息写入 SAP(调用 RFC)。
适配器仅在新消息到达“引擎”时调用,因此可以有长达 1 天或更长时间的无事件时间。这就是问题所在,连接句柄在 STANDARD 代码中的“低级套接字”层上变得无效/或者通过 SAP 本身的一些 SAP 参数可能会说“杀死不再事件的句柄”
所以我现在要做的是生成一个“位于适配器顶部”的线程,并且每 10 秒左右 PINGS SAP。这里的问题是我使用相同的连接句柄向 SAP 发送消息以及 PING/HEARTBEAT 消息。
SAP 对 RFC 句柄说:
"一个 RFC 句柄可以在多个线程中使用,但一次只能在一个线程中激活。一个 RFC 连接的 RFC 句柄,由一个线程创建,可以在 另一个线程,但是这些线程必须同步对这个句柄的访问。"
但现在我已经尝试使用“pthread_mutex_lock”等来完成这项工作,但它没有。
我有一个全局“句柄”,当我的适配器 SHARED LIB 启动时,我启动一个线程,如下所示:
rc = pthread_create(&heartbeatThread, NULL, heartbeatThreadMainLoop, (void *)NULL);
而且这个线程每 10 秒左右 PING 一次 SAP。
在一个完美的世界中,我希望 SAP 的 MESSAGING 在这里优先,因此 PING 应该完全等到它“安静”,然后再次启动。
我看过如下链接:
http://www.yolinux.com/TUTORIALS/LinuxTutorialPosixThreads.html#SYNCHRONIZATION
但我实际上想锁定/解锁一整段代码,所以正如我所说,如果 MESSAGE 进入 SAP PING 线程必须等待....但是如果 PING 线程忙我想以某种方式中断它并说“嘿,我需要那个连接句柄来发送消息”...
对此的最佳实践“模式”是什么?
非常感谢您的帮助
谢谢
林顿
最佳答案
可以通过增加 ADAPTER 的范围来简化整个架构。
与其主循环无限期地等待请求,不如让它在 10 秒后超时。如果超时,则执行唤醒逻辑。在任一情况下(请求或超时),重置计时器。
这避免了整个共享问题,并使 ADAPTER 负责与 SAP 的所有交互。
关于C - 如何同步访问连接句柄,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10234283/