gpt4 book ai didi

java - 涉及线程的c++/Java之间的函数完成信号

转载 作者:太空宇宙 更新时间:2023-11-04 12:05:07 24 4
gpt4 key购买 nike

在 C++ JNI 函数(下面包含的半伪函数)中,在 client_ = new VClient(&callback_) 行中创建了至少一个(可能是两个)附加线程。我认为完成这个函数就足够了,但显然当下一个函数(另一个 JNICALL 函数)在此之后被“立即”调用时,它会导致 SEGFUALT(“立即”在引号中,因为该函数被调用的速度与有人可以按下一个按钮)。我认为这是因为 new VClient 的创建在 Init 函数返回并调用下一个函数时尚未完成,因为 client_ 将在下一个中使用功能。

我对所有线程业务都很陌生,我不确定这是否是正确的思路。我习惯于顺序执行代码,因此当代码从 client_ 行开始时,那是因为该行的所有内容都已完成。代码是否有可能从此行继续,并在新的 VClient 完全创建之前从 JNI Init 函数返回?如果是这样,我如何让这个函数等到类/对象创建完成?

JNIEXPORT void JNICALL Java_com_ClassDir_Init(JNIEnv *env, jobject obj)
{
LOGI("%s", __PRETTY_FUNCTION__);
if(!client_)
{
LOGI("Initializing client");
client_ = new VClient(&callback_);
[Bunch of JNI/JAVA class and methodID lookup and saving]
}
else
LOGI("Client already initialized");
}

*callback_ 是一个处理向 JNI/JAVA 发送枚举类型信号以更新程序进度的类。

最佳答案

你说 VClient 构造函数创建线程。 创建 线程是一个同步 过程:VClient ctor 的执行不会继续,直到线程完全创建并且很可能已经启动,因为我在 VClient 实例上看不到任何其他方法调用来执行此操作。什么是同步,是线程的这个开始。它并不意味着“完全可操作”,只是您的主线程已指示创建的线程开始在其自己的上下文中运行。当新线程的执行循环被设置和进入时,它是完全异步的(对于您的 VClient 构造)并且取决于线程调度。因此,如果您的“下一个 JNI 函数”试图调用该线程并在那里使用一些资源,则该资源必须已经可用(这意味着您希望新线程已经进展到使其可用的程度)并且可以访问必须保护该资源以进行线程安全访问。

因此,您需要在这个线程业务中变得不那么陌生 :-) 查看两个基本构建 block :

  1. 等待条件(也称为“阻塞条件变量”)。调用 VClient ctor 后,您将等待一个需要传递给线程的对象。线程将在完成其基本工作时通知条件,从而解除第一个线程中的等待。
  2. 互斥体。每当有一个资源(数据结构)可以被多个线程执行并发访问时,你需要在访问代码之前锁定互斥锁,然后解锁。稍后到达的线程将阻塞在锁上,直到第一个线程完成。否则当两个线程试图修改同一个内存时,你会得到奇怪的结果或直接崩溃。

这些在每个操作系统和每个框架的各种 API 中的实现方式不同。即使是同一操作系统上的不同框架也往往不同。但理念是平等的。

顺便说一句,我理所当然地认为 client_ 的声明方式在 “下一个 JNI 函数” 尝试使用它时不会超出范围。这可能意味着 JNI 实现中的全局变量 - 我没有看到 native 代码的任何类包装器。

关于java - 涉及线程的c++/Java之间的函数完成信号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12502755/

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