c和x2B之间的功能完成信号+/涉及线程的Java
在C++的JNI函数(下面包含半伪函数)中,在<代码> clitNy=新VCube(和CalbBebug)行中创建了至少一个(并且可能两个)额外线程。我认为完成这个函数就足够了,但是很明显,当下一个函数(另一个JNICALL函数)在此之后被“立即”调用时,它会导致一个SEGFUALT(“立即”在引号中,因为函数被调用的速度与按下下一步按钮的速度一样快)。我认为这是因为在Init函数返回并调用下一个函数时,创建c和x2B之间的功能完成信号+/涉及线程的Java,java,c++,multithreading,java-native-interface,Java,C++,Multithreading,Java Native Interface,在C++的JNI函数(下面包含半伪函数)中,在 clitNy=新VCube(和CalbBebug)行中创建了至少一个(并且可能两个)额外线程。我认为完成这个函数就足够了,但是很明显,当下一个函数(另一个JNICALL函数)在此之后被“立即”调用时,它会导致一个SEGFUALT(“立即”在引号中,因为函数被调用的速度与按下下一步按钮的速度一样快)。我认为这是因为在Init函数返回并调用下一个函数时,创建新VClient尚未完成,因为下一个函数中正在使用客户端 我对所有这些线程业务都比较陌生,我不确
新VClient
尚未完成,因为下一个函数中正在使用客户端
我对所有这些线程业务都比较陌生,我不确定这是否是一种正确的思路。我习惯于按顺序执行代码,因此当代码从客户机
行移动时,这是因为该行的所有内容都已完成。在新的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");
}
*回调
是一个处理向JNI/JAVA发送枚举类型信号以更新程序进度的类 否。在VClient构造函数退出之前,调用“new VClient()”的代码行不会继续到下一行。执行是顺序的。您的问题在别处。否。在VClient构造函数退出之前,调用“new VClient()”的代码行不会继续到下一行。执行是顺序的。您的问题在别处。您说过VClient
构造函数创建线程创建线程是一个同步过程:VClient
ctor的执行在线程完全创建之前不会继续,而且很可能已经启动,因为我没有看到任何其他方法调用VClient istance来执行。不同步的是线程的开始。这并不意味着“完全可操作”,只是主线程已指示创建的线程开始在其自己的上下文中运行。当新线程的执行循环被设置和输入时,它是完全异步的(对于VClient构造)和线程调度。因此,如果您的“下一个JNI函数”试图调用该线程并使用该线程中的一些资源,那么该资源必须已经可用(这意味着您希望新线程已经发展到可以使用的程度),并且必须为线程安全访问保护对该资源的访问
因此,在线程业务中,您需要变得不那么陌生:-)查找两个基本的构建块:
等待条件(也称为“阻塞条件变量”)。调用VClient-ctor后,您将等待需要传递到线程中的对象。线程将在完成其基本工作时通知条件,从而解除第一个线程中的等待
互斥体。只要有一个资源(数据结构)可以通过执行多个线程来并发访问,就需要在访问代码之前锁定互斥锁,然后解锁。随后到达的线程将阻塞锁,直到第一个线程完成。否则,当两个线程试图修改同一内存时,您将得到奇怪的结果或直接的崩溃
每个操作系统和每个框架在不同的API中实现的方式不同。即使是同一操作系统上的不同框架也会有所不同。但哲学是平等的
顺便说一句,我想当然地认为,client\uu
的声明方式在“下一个JNI函数”尝试使用它时不会超出范围。这可能意味着JNI实现中有一个全局变量-我没有看到本机代码的任何类包装器。您说过VClient
构造函数创建线程创建线程是一个同步过程:VClient
ctor的执行在线程完全创建之前不会继续,而且很可能已经启动,因为我没有看到任何其他方法调用VClient istance来执行。不同步的是线程的开始。这并不意味着“完全可操作”,只是主线程已指示创建的线程开始在其自己的上下文中运行。当新线程的执行循环被设置和输入时,它是完全异步的(对于VClient构造)和线程调度。因此,如果您的“下一个JNI函数”试图调用该线程并使用该线程中的一些资源,那么该资源必须已经可用(这意味着您希望新线程已经发展到可以使用的程度),并且必须为线程安全访问保护对该资源的访问
因此,在线程业务中,您需要变得不那么陌生:-)查找两个基本的构建块:
等待条件(也称为“阻塞条件变量”)。调用VClient-ctor后,您将等待需要传递到线程中的对象。线程将在完成其基本工作时通知条件,从而解除第一个线程中的等待
互斥体。只要有一个资源(数据结构)可以通过执行多个线程来并发访问,就需要在访问代码之前锁定互斥锁,然后解锁。随后到达的线程将阻塞锁,直到第一个线程完成。否则,当两个线程试图修改同一内存时,您将得到奇怪的结果或直接的崩溃
每个操作系统和每个框架在不同的API中实现的方式不同。甚至sam上的不同框架