gpt4 book ai didi

使用 native 代码的 Android 多线程

转载 作者:行者123 更新时间:2023-11-30 03:34:24 24 4
gpt4 key购买 nike

我在做一个android项目,发现一个操作成为了性能瓶颈。此操作适用于大型数组 A,并将结果存储到另一个数组 B。

我发现这个操作可以并行化。数组 A 可以分成 N 个更小的段。该操作可以独立地对每个段进行操作,并将结果存储到B中相应的段中。

操作是用 native 代码编写的,使用 GetPrimitiveArrayCritical/ReleasePrimitiveArrayCritical 对访问数组 A 和 B。

我的问题是,如果使用多线程,GetPrimitiveArrayCritical(pEnv, A, 0) 将被不同线程多次调用。 GetPrimitiveArrayCritical 会阻塞吗?即,如果一个线程进行此调用,第二个线程能否在第一个线程调用 ReleasePrimitiveArrayCritical() 之前进行相同的调用?

请帮忙。

最佳答案

是的,您可以从两个并发线程调用 GetPrimitiveArrayCritical()。该函数不会阻塞,并且您的两个线程会将对底层数组的访问权限授予 native 代码。但另一方面,该函数不会同步此访问,即如果线程 1 更改索引 100 处的值,并且线程 2 也更改索引 100 处的值,您不知道最后会选择哪个.

如果您不写入数组,则可以保证您得到正确的服务。不要忘记使用 JNI_ABORT 标志来 ReleasePrimitiveArrayCritical

如果要写入数组,请检查输出参数 isCopyGetPrimitiveArrayCritical(JNIEnv *env, jarray array, jboolean *isCopy) 设置.如果结果为 0,您可以安全地继续使用多线程方法。

如果结果不为 0,ReleasePrimitiveArrayCritical() 将覆盖 Java 数组的所有元素,即使其中一些元素在不同线程的 Java 或 C 中已更改。如果您的程序检测到这种情况,它必须释放数组(使用 JNI_ABORT)并等待其他线程完成。 在 Android 上,我从未见过数组被复制,它们总是被锁定在原地。 但没有人能保证这不会发生在你身上,无论是在当前系统还是在未来的版本中。

这就是为什么您必须检查 isCopy 参数。

关于使用 native 代码的 Android 多线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16863243/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com