JNI 环境中 pthread_cond_broadcast() 和 pthread_cond_timedwait() 的等效函数是啥?
Posted
技术标签:
【中文标题】JNI 环境中 pthread_cond_broadcast() 和 pthread_cond_timedwait() 的等效函数是啥?【英文标题】:What are the equivalent functions in the JNI env for pthread_cond_broadcast() and pthread_cond_timedwait()?JNI 环境中 pthread_cond_broadcast() 和 pthread_cond_timedwait() 的等效函数是什么? 【发布时间】:2021-03-26 05:56:56 【问题描述】:在阅读了this 之后,我现在了解了如何在 JNI 的本机端同步线程的关键部分。
但是,我找不到这 2 个 pthread 调用的等效函数: pthread_cond_timedwait() 和 pthread_cond_broadcast()
我有一个长时间运行的响应处理程序线程,它在 Java 中启动,然后下降到 C 中以接收网络数据,然后将数据排入全局共享响应队列。
同时,我有多个请求线程,它们在 Java 中启动,然后下降到 C 中,向服务器发出网络请求,然后等待响应显示在全局共享响应队列中。
长时间运行的响应线程中的相关代码是:
/* after enqueuing a network response to the global shared Q */
/* wake up all of the request threads waiting for a response */
pthread_cond_broadcast(&q_entry_cv);
以及请求线程中的相关代码:
if(q_entries == 0)
pthread_cond_timedwait(&q_entry_cv, &qlock, &ts);
/* wake up when the response thread has q'd a new response & search the q*/
这些 POSIX 调用是否有任何等效的 JNI 调用?
【问题讨论】:
没有。是什么让你认为会有? 目前实施的部分解决方案是不充分的。 也许除了 user207421 和我之外的其他人能想到一个可行的替代方案。 这不是任何人能想到的问题。您的问题专门针对 JNI 环境中的函数,它们都列在 JNI 规范中,并且没有任何用于此目的。我同意@user0 的观点,你应该使用Object.wait()
和Object.notifyAll()
,但是你没有询问Java 空间中的方法。
【参考方案1】:
您似乎在谈论 wait(long,int) 和 notifyAll() 方法。 Java 中的每个对象都有这些方法。here 描述了如何从 JNI 调用实例方法。
【讨论】:
谢谢@user0。我将实现回调,看看是否足够。以上是关于JNI 环境中 pthread_cond_broadcast() 和 pthread_cond_timedwait() 的等效函数是啥?的主要内容,如果未能解决你的问题,请参考以下文章
JNI 环境中 pthread_cond_broadcast() 和 pthread_cond_timedwait() 的等效函数是啥?