Исходя из среды Java (в частности, Android) У меня никогда не возникало проблем с выполнением некоторого кода в новом потоке без блокировки основного потока. Как я должен работать с C++, теперь я наткнулся на проблему.C++ serial thread executor
код клиента выполняет мой родной (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)?
- Если требуется время, чтобы записать данные в базу данных, что происходит с объектом
DataProcessor
в течение этого времени (так как он должен быть уничтожен после ответа на ответ через JNI по мере того, как заканчивается его срок действия), может быть, я чего-то не хватает)? - Есть ли какой-либо исполнитель серийных потоков, чтобы я мог написать несколько вещей в базу данных (они будут помещены в очередь FIFO и сохранены в последовательности в том же потоке)?
Я понятия не имею о jni, b ut вы можете создать поток, который записывается в базу данных и немедленно отделять его. – MikeMB
Однако имейте в виду, что создание потока - дорогостоящая операция, поэтому наличие одного выделенного потока для ведения журнала, как вы предположили, безусловно, будет более эффективным. – MikeMB