Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/date/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何以线程安全的方式取消在Solace上下文中注册的计时器? 情况_Solace - Fatal编程技术网

如何以线程安全的方式取消在Solace上下文中注册的计时器? 情况

如何以线程安全的方式取消在Solace上下文中注册的计时器? 情况,solace,Solace,我正在使用Solace C API 我想把我的情况下的状态对象与C++对象关联起来,但是对于C API,当计时器触发和安慰调用我的计时器回调例程时,它只是空洞的用户数据。我使用Solace API调用solClient\u context\u startTimer注册计时器 假设我还想从另一个线程取消计时器,知道solClient\u context\u startTimer返回的计时器ID。我的问题是,我还想取消分配state对象。因此,如果计时器可以从上下文线程触发,则用户数据指针将悬空 在

我正在使用Solace C API

我想把我的情况下的状态对象与C++对象关联起来,但是对于C API,当计时器触发和安慰调用我的计时器回调例程时,它只是空洞的用户数据。我使用Solace API调用solClient\u context\u startTimer注册计时器

假设我还想从另一个线程取消计时器,知道solClient\u context\u startTimer返回的计时器ID。我的问题是,我还想取消分配state对象。因此,如果计时器可以从上下文线程触发,则用户数据指针将悬空

在对solClient_context_stopTimer的调用和向现在已停止的计时器输入回调函数的上下文线程之间是否存在竞争

可能有效或可能无效的可能解决方案 如果是这样的话,有没有人能建议一些方法来避免试图访问悬空的指针?我能想到出发点,但他们都有自己的问题:

与其传递原始指针作为用户数据,不如传递某种类型的ID,基本上是弱引用,我可以在哈希表中查找。不幸的是,这意味着hashtable必须是一个全局变量,我更愿意避免它,因为只有一个用户数据指针,并且我无法将hashtable对象的地址传递给回调函数。 使用消息传递来取消计时器,以避免跨线程对象所有权问题。这意味着我必须重写代码来运行上下文线程,添加队列处理,这对于我的需要来说似乎太复杂了。 对对象状态使用某种垃圾收集队列,以便在没有上下文线程明确确认的情况下,用户数据指针永远不会悬空。同样,这似乎涉及到更复杂的问题,因为这本质上涉及到为这些计时器对象/状态专门分配内存。 使用计时器时,使两个线程相互排除。不过,首先要避免在回调例程中接收悬空指针,在进入计时器回调之前必须进行锁定,这意味着修改上下文线程的事件循环,如2。 此外,我看到计时器ID没有传递给计时器例程,因此它不可能自己检查它是否在该racy条件下执行

如果solClient\u context\u stopTimer阻塞当前线程,直到任何正在进行的回调例程完成,那么只有在进行该调用之后,才很容易删除state对象。但是从API文档中还不清楚solClient\u context\u stopTimer是否有这样的行为。

是的,C没有智能指针。Solace C API通过等待上下文线程完成计时器回调来处理这种情况,如果等待重试时间过长,它将返回SOLCLIENT_FAIL


简而言之,比赛条件已经得到了考虑,你不需要复杂的解决办法。

好的,这很有帮助。我试试这个。