У меня есть C ++ S-функция, которая обрабатывает множество потоковых операций через std :: thread, std :: async и обратные вызовы.
Дело в том, что одним из обратных вызовов является S-функция, которая имеет буфер в списке захвата. Этот буфер находится в PWork модели Simulink. Однако, похоже, что Matlab вылетает, как только я пытаюсь записать в него.
Ниже приведен минимальный пример сбоя моей S-функции (только функция mdlStart), который содержит соответствующий код:
static void mdlStart(SimStruct *S)
{
ssGetPWork(S)[0] = (void *) new ThreadedDataServer();
ssGetPWork(S)[1] = (void *) new DatagramAssembler();
ssGetPWork(S)[2] = (void *) new MyBufferType(); // actually an std::array<char, LARGENUMBER>
auto server = (ThreadedDataServer *) ssGetPWork(S)[0];
auto assembler = (DatagramAssembler*) ssGetPWork(S)[1];
auto copy_buffer_ptr = (MyBufferType *) ssGetPWork(S)[2];
server->attachDataHandler([©_buffer_ptr, &assembler](const ThreadedDataServer::buffer_t & buffer, size_t num_bytes)
{
/* Minimal crashing action */
copy_buffer_ptr->at(5) = 'b'; // Any index != 0
/* Original code */
//std::copy(buffer.begin(), buffer.begin() + num_bytes, copy_buffer_ptr->data());
//assembler->feedData(*copy_buffer_ptr, num_bytes);
});
}
Обработчик вызывается из рабочего потока сервера данных (отличается от основного потока Simulink). Другие действия внутри функции обратного вызова работают гладко (чтение параметров, выполнение других операций ...).
Есть подсказка, почему это происходит? Этот же код работал в независимом исполняемом файле до его интеграции в Simulink.