来自Java环境(特别是Android)我从来没有任何问题在新线程中执行一些代码而不阻塞主线程。因为我现在必须使用C++,所以我偶然发现了这个问题。C++串口线程执行器
客户端代码执行我的家乡(C++)代码通过JNI:
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
我希望做两个thigs:
- 过程中的数据,并尽快返回它
- 将数据写入活动日志(例如数据库)而不延迟响应(所以首先返回响应然后记录数据)
示例代码:
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;
}
}
我主要concers是:
- 是否有可能在C++(我使用C++ 11)?
- 如果将数据写入数据库需要一段时间,那么在此期间对象会发生什么情况(因为在它的生命周期结束时通过JNI返回响应后应该销毁 - 也许我在这里丢失了某些内容)?
- 是否有任何串行线程执行程序,以便我可以向数据库写入一些内容(它们将被放入FIFO队列并在同一线程中依次保存)?
我不知道jni,b您可以创建一个写入数据库的线程并立即将其分离。 – MikeMB
但是,请注意创建一个线程是一个代价高昂的操作,因此如您所建议的那样,使用单个专用线程进行日志记录的话肯定会更高效。 – MikeMB