c - MQ C API - 如何在多线程环境中中止等待的 `MQGET`

标签 c ibm-mq

我在多线程应用程序中使用 MQ C API,其中多个工作线程通过在循环中调用 MQGET(使用 MQGMO_WAIT 设置和 MQWI_UNLIMITED 的等待间隔。

它可以工作,但我找不到关闭工作线程的干净方法。如果我在另一个线程中调用 MQDISCMQCLOSE,只要有未完成的 MQGET 调用,它就会阻塞。

目前我最好的解决方案是使用 5000 的有限等待间隔而不是 MQWI_UNLIMITED,这样 MQGET 调用每 5 秒返回一次,让应用程序有机会关闭。但此解决方案效率较低(工作线程每 5 秒唤醒一次),并且应用最多需要 5 秒才能关闭。

使用 native OS API 终止线程听起来不是一个好的解决方案。

所以问题是 - 当等待间隔为 MQWI_UNLIMITED 时,是否有任何方法可以完全中止正在等待的 MQGET

操作系统是Windows Server 2012 x64,MQ服务器版本是7.0.0.19。

最佳答案

已经给出的两个答案都是不错的选择,我还有第三个要添加,所以这里是完整列表。

  • 你至少在 V7 上,所以你可以使用回调机制、MQCB 和回调函数,然后你可以使用 MQCTL 挂起或停止连接。
  • 使用管理命令,或在另一个线程上使用 MQSET 调用,将队列更改为 GET(DISABLED),这将使用 MQRC_GET_INHIBITED 唤醒 MQGET 等待。
  • 从另一个线程 MQPUT(1) 向 MQGET 正在等待的队列发送一条消息。确保您的获取代码理解此消息的格式/内容表示“结束应用程序的时间”。

所有这些都同样有效,但需要对您当前的应用程序进行不同程度的更改,并且只有您知道在您的代码中哪个最简单。

关于c - MQ C API - 如何在多线程环境中中止等待的 `MQGET`,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36990419/

相关文章:

c - 看看 C 中字符串是否转换为 double

c - 格式化此语句的惯用 C 方式是什么

C - (Printf) 强制显示零

java - 解决 IBM MQ 独立应用程序中的 MQRC 2195 错误

java - Websphere MQ v8 - MQRC_NOT_AUTHORIZED - 2035

c - 返回指向子数组的指针

c - 扫描字符然后在 IF 语句中使用它们? (如果 char= ='c' ){} 等

java - JMS API 无法浏览消息,IBM API 可以

java - 使用适用于 Java 的 MQ 类运行简单 jar 时出错

java - Websphere MQ 7.0 + jar 与 5.3 和 6.0 MQSeries 服务器兼容吗?