Android C++;串行线程执行器
我来自Java环境(特别是Android),在不阻塞主线程的情况下,在新线程中执行某些代码从来没有遇到过任何问题。 由于我现在必须用C++来工作,所以我无意中发现了这个问题。 客户端代码通过JNI执行我的本机(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_) {
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);
}
我主要关心的是:
DataProcessor
对象在这段时间内会发生什么情况(因为在生命周期结束时通过JNI返回响应后,它应该被销毁-可能我在这里遗漏了什么)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;
}
}