【问题标题】:sem_timedwait with Android NDKsem_timedwait 与 Android NDK
【发布时间】:2014-09-17 07:33:43
【问题描述】:

在调查期间,我发现 NDK 中的信号量原语实现存在一些差距。 我当前的任务需要 sem_timedwait(就像 sem_wait 只是超时),但我在 NDK 中找不到它。 还有一件更重要的事情:代码应该在 iOS 平台上可移植。

我目前的建议:

第 1 步: 使用 sem_wait 创建单独的线程 (thrd_id1)(等到 sem_post,可能永远卡在那里)

第 2 步:创建单独的线程 (thrd_id2),在几秒钟内睡眠和我们醒来时

第 3 步: 当我们被唤醒时 (thrd_id2) 尝试使用 sem_wait (thrd_id1) 取消线程,以防成功返回ETIMEOUT,否则 sem_wait 会被另一个线程的 sem_post 解锁。 但是 pthread 的 NDK 实现没有可取消的线程。

pthread_kill 有其他想法,但我怎么知道它是正常终止还是终止?

请指教。

【问题讨论】:

  • 不知何故,我怀疑如果 Android NDK 有sem_wait(或sem_trywait),它就不会有sem_timedwait。所有这些功能在 POSIX(和 Linux)中已经存在很多年了,早在人们想到 Android 之前。您是否与manual page 中指定的-pthread 标志链接?
  • Linux 多年来一直拥有所有这些功能,正如您所建议的那样。但是只有最新的 NDK 有 sem_timedwait。但是我的项目规范需要早期版本的 NDK。提前致谢

标签: android c++ android-ndk pthreads semaphore


【解决方案1】:

sem_timedwait 至少从版本 r9d 开始存在于 Android NDK 中(我没有更早的版本) - 检查 platforms/android-%yourplatform%/arch-%yourarch%/usr/include/semaphore.h

如果不能切换到较新的 NDK,我建议您使用 just take GNU implementation

【讨论】:

  • 项目的规范需要较早版本的NDK,所以我正在尝试自己实现。无论如何,提前谢谢。
  • @OleksandrHryhorchuk 使用早期版本的 NDK 的原因是什么?现代 NDK 版本支持从 API 3 (Android 1.5) 开始的所有 Android 平台
  • 这是一个安全项目,所有工具和sdks更新都是客户认可的,他在这个问题上并不那么勇敢。
  • 我查过了,sem_timedwait 甚至在 2010 年初的 NDK r3 中也存在。此外,只要在链接库中找到它,总是可以手动添加原型 (extern int sem_timedwait(sem_t *sem, const struct timespec *abs_timeout); ) 在调用代码中,即使标头缺少它。
  • @AntonSavin 谢谢分配,我今天会检查解决方案!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-07-13
  • 2011-06-25
  • 2016-10-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多