[英]MQ C API - how to abort a waiting `MQGET` in a multithreaded environment
我在多線程應用程序中使用MQ C API,其中多個工作線程正在通過在循環中調用MQGET
(設置了MQGMO_WAIT
且等待間隔為MQWI_UNLIMITED
)來處理各自隊列中的傳入消息。
它可以工作,但是我找不到關閉工作線程的干凈方法。 如果我在另一個線程中調用MQDISC
或MQCLOSE
,則只要有未完成的MQGET
調用,它就會阻塞。
現在,我最好的解決方案是使用5000
的有限等待間隔,而不是MQWI_UNLIMITED
,這樣, MQGET
調用每5秒返回一次,從而使應用程序有機會關閉。 但是此解決方案效率較低(工作線程每5秒喚醒一次),並且該應用最多需要5秒才能關閉。
使用本機OS API終止線程聽起來不是一個好的解決方案。
所以問題是-當等待間隔為MQWI_UNLIMITED
時,是否有任何方法可以干凈地中止等待的MQGET
?
操作系統是Windows Server 2012 x64,MQ服務器版本是7.0.0.19。
使用MQCallBack調用而不是MQGET。
一種選擇是,如果您禁用從隊列中獲取(即ALTER QLOCAL(xxx)GET(DISABLED)),則任何等待中的吸氣劑都會由於MQRC_GET_INHIBITED的原因而立即拋出。
已經給出的兩個答案是不錯的選擇,我要添加第三個答案,所以這里是完整列表。
所有這些都同樣有效,但是需要對當前應用程序進行不同程度的更改,只有您才能知道哪種代碼最簡單。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.