Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/351.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/134.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
c和x2B之间的功能完成信号+/涉及线程的Java_Java_C++_Multithreading_Java Native Interface - Fatal编程技术网

c和x2B之间的功能完成信号+/涉及线程的Java

c和x2B之间的功能完成信号+/涉及线程的Java,java,c++,multithreading,java-native-interface,Java,C++,Multithreading,Java Native Interface,在C++的JNI函数(下面包含半伪函数)中,在 clitNy=新VCube(和CalbBebug)行中创建了至少一个(并且可能两个)额外线程。我认为完成这个函数就足够了,但是很明显,当下一个函数(另一个JNICALL函数)在此之后被“立即”调用时,它会导致一个SEGFUALT(“立即”在引号中,因为函数被调用的速度与按下下一步按钮的速度一样快)。我认为这是因为在Init函数返回并调用下一个函数时,创建新VClient尚未完成,因为下一个函数中正在使用客户端 我对所有这些线程业务都比较陌生,我不确

在C++的JNI函数(下面包含半伪函数)中,在<代码> clitNy=新VCube(和CalbBebug)行中创建了至少一个(并且可能两个)额外线程。我认为完成这个函数就足够了,但是很明显,当下一个函数(另一个JNICALL函数)在此之后被“立即”调用时,它会导致一个SEGFUALT(“立即”在引号中,因为函数被调用的速度与按下下一步按钮的速度一样快)。我认为这是因为在Init函数返回并调用下一个函数时,创建
新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上的不同框架