Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/193.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/143.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
Android C++;串行线程执行器_Android_C++_Multithreading_C++11_Java Native Interface - Fatal编程技术网

Android C++;串行线程执行器

Android C++;串行线程执行器,android,c++,multithreading,c++11,java-native-interface,Android,C++,Multithreading,C++11,Java Native Interface,我来自Java环境(特别是Android),在不阻塞主线程的情况下,在新线程中执行某些代码从来没有遇到过任何问题。 由于我现在必须用C++来工作,所以我无意中发现了这个问题。 客户端代码通过JNI执行我的本机(C++)代码: JNIEXPORT jbyteArray JNICALL Java_com_native_project_NativeInterface_processData(JNIEnv *env, jobject instance, jbyteArray inputData_) {

我来自Java环境(特别是Android),在不阻塞主线程的情况下,在新线程中执行某些代码从来没有遇到过任何问题。 由于我现在必须用C++来工作,所以我无意中发现了这个问题。 客户端代码通过JNI执行我的本机(C++)代码:

JNIEXPORT jbyteArray JNICALL
Java_com_native_project_NativeInterface_processData(JNIEnv *env, jobject instance, jbyteArray inputData_) {
    vector<unsigned char> inputData = jbyteArrayToBytes(env, inputData_);
    const vector<unsigned char> &result = getDataProcessor(env, instance).processData(inputData);
    return bytesTojbyteArray(env, result);
}

DataProcessor getDataProcessor(JNIEnv *env, jobject instance) {
    return DataProcessor(env, instance);
}
我主要关心的是:

  • 在C++中(我使用C++ 11)吗?
  • 如果将数据写入数据库需要一段时间,
    DataProcessor
    对象在这段时间内会发生什么情况(因为在生命周期结束时通过JNI返回响应后,它应该被销毁-可能我在这里遗漏了什么)
  • 是否有任何串行线程执行器,以便我可以向数据库写入一些内容(它们将被放入FIFO队列,并在同一线程中按顺序持久化)

  • 2011之前,必须直接使用原生API,如PrPro或部署第三方包装器LIBS,就像Boost中的那些,但是自从2011以来,C++提供了一个非常胖的标准化接口。 也许你先自己看看,试试看,然后在你的帖子中添加更具体的问题;然后,我会相应地扩展这个答案

  • 考虑的一个变体,以实现串行执行队列来执行必须串行化的长期运行工作:
  • #包括
    #包括
    #包括
    #包括
    类SerialExecutionQueue
    {
    公众:
    typedef std::函数队列项;
    SerialExecutionQueue():
    m_应该退出(错误),
    m_执行人([本]()
    {
    执行人();
    })
    {
    }
    无效排队工作(队列项目)
    {
    {
    std::锁保护l(mumutex);
    m_队列推送(项目);
    }
    m_cv.通知所有人();
    }
    无效执行人()
    {
    而(!m_应该退出)
    {
    std::唯一的_锁(m_互斥);
    while(m_queue.size())
    {
    auto item=m_queue.front();
    m_queue.pop();
    m_mutex.unlock();
    项目();
    m_mutex.lock();
    }
    m_cv.等待(锁定);
    }
    }
    私人:
    布尔穆应该辞职;
    std::条件变量m_cv;
    std::mutex m_mutex;
    std::队列m_队列;
    std::线程m_执行器;
    };
    
    int main(int argc,const char*argv[]
    {
    串行执行队列;
    queue.enqueueWork([]()
    {
    
    std::我对jni一无所知,但是您可以创建一个写入数据库的线程并立即将其分离。但是,请注意,创建一个线程是一项代价高昂的操作,因此按照您的建议,使用一个专用线程进行日志记录肯定会更有效。
    class BasicAsync {
    private:
        void logToDB(const vector<unsigned char> &inputData) {
            // connect to DB and write data to it
        }
    
        vector<unsigned char> compute(const vector<unsigned char> &inputData) {
            vector<unsigned char> result = vector<unsigned char>();
            // rocket-science computation in here
            return result;
        }
    
    public:
        vector<unsigned char> processData(const vector<unsigned char> &inputData) {
            // perform data computation and produce output
            vector<unsigned char> result = compute(inputData);
    
            // create a thread that writes the data to activity log without delaying the response return
            logToDB(inputData);
    
            //return result while data is written to activity log
            return result;
        }
    }