【问题标题】:Solac Single thread C ApplicationSolac 单线程 C 应用程序
【发布时间】:2019-02-08 08:22:03
【问题描述】:
刚刚开始使用 C APISolac。但是我发现如果我使用 solac,应用程序将是多线程的。
我有 C 应用程序,它是单线程并有多个连接(例如,TCP、UDP、FILE、timerfd)我正在使用 epoll 进行轮询。它们相互依赖。我想使用 Solac 作为 epoll 上的另一个连接。我想将我的应用程序保持为单线程,因为它具有依赖关系。如果可以在单线程中使用 Solac 连接,请有人帮助我。
问候,
赛义德·莫明
【问题讨论】:
标签:
c
multithreading
solace
solace-mq
【解决方案1】:
为 FD 处理和 Solace C API 内部的所有内容提供单独的上下文线程是默认行为。
这可以通过多种方式进行更改,但请阅读https://docs.solace.com/Solace-PubSub-Messaging-APIs/Developer-Guide/C-API-Best-Practices.htm中的“选择线程模型”和“文件描述符管理”
假设您想自己运行 epoll_wait() 并管理 API 的 FD,以下是所需的指南。这假设一个单一的上下文。
-
禁用上下文线程的自动创建。
contextProps[ctxtIndex++] = SOLCLIENT_CONTEXT_PROP_CREATE_THREAD;
contextProps[ctxtIndex++] = SOLCLIENT_PROP_DISABLE_VAL;
-
在solClient_context_create()中填写solClient_context_createFuncInfo_t你自己的FD管理函数:
-
solClient_context_registerFdFunc_t 和
-
solClient_context_unregisterFdFunc_t。
前者为EPOLL_CTL_ADD/MOD注册回调函数,后者为EPOLL_CTL_DEL/MOD。注意:
-
SOLCLIENT_FD_EVENT_ALL ~ EPOLLIN | EPOLLOUT
-
SOLCLIENT_FD_EVENT_READ ~ EPOLLIN
-
SOLCLIENT_FD_EVENT_WRITE ~ EPOLLOUT
Solace C API 将通过这些定义的函数注册自己的 FD 事件回调。
-
在您的主 epoll 循环中:
-
epoll_wait() 超时 = SOLCLIENT_CONTEXT_PROP_DEFAULT_TIME_RES_MS
- 每
epoll_wait()超时调用solClient_context_timerTick()
- 对 FD 事件进行回调
查看 Solace C API 参考以获取有关此答案中所述符号的更多详细信息:
https://docs.solace.com/API-Developer-Online-Ref-Documentation/c/index.html