【发布时间】:2018-01-11 17:22:26
【问题描述】:
我将一个委托(日志记录函数)传递给非托管代码,它工作正常,除非它是从另一个线程调用的,它是 C++ 库的内部线程。 我阅读了this,但我找不到任何关于当涉及 C++ 线程时我应该期待什么的信息。这绝对是线程问题,因为当我从从 Unity 调用非托管函数的同一个线程调用它时,委托工作。
C#
public class SomeClass : MonoBehaviour
{
public delegate void LibLogHandler(int a);
private LibLogHandler handlerDelegate;
[DllImport ("mylibrary")]
private static extern bool library_init (string arg1, string arg2, LibLogHandler logHandler);
public void goNow()
{
this.handlerDelegate = new LibLogHandler (this.logHandler);
bool res = library_init ("someArg1", "someArg2", this.handlerDelegate);
Debug.Log ("library init: " + res);
}
void logHandler(int a)
{
Debug.Log ("[library] " + a);
}
}
C++ 标头
extern "C" {
typedef void (*LibLog) (int a);
bool library_init(const char* arg1, const char* arg3, LibLog libLog);
}
C++ 源代码
static boost::asio::io_service IoService;
static boost::thread aThread;
static boost::shared_ptr<boost::asio::io_service::work> ThreadWork;
bool library_init(const char* arg1, const char* arg2, LibLog libLog)
{
#ifdef THREAD_ENABLED
ThreadWork.reset(new boost::asio::io_service::work(IoService));
aThread = boost::thread([](){
IoService.run();
});
IoService.dispatch([libLog]{
libLog(100);
});
#else
libLog(10);
#endif
return true;
}
因此,当THREAD_ENABLED 被定义时,应用程序会静默崩溃而没有其他信息。
【问题讨论】:
标签: c# android c++ multithreading