我需要创建一个C ++ / CLI混合程序集,它可以将未来的调用安排到具有毫秒精度的本机DLL中。
这当然意味着预先设置一个计时器(是什么类型的?)一毫秒或三个,然后旋转到那一刻并调用本机DLL函数。
根据我所读到的内容,我猜测定时器调用的回调需要是本机的,以确保没有thunk或GC来延迟处理定时器回调。
整个线程或进程是否需要本机和无CLR,或者这可以通过#pragma unmanaged或将程序集的一个文件设置为本机编译来完成吗?
若然,怎么样?
如果在混合模式C ++ / CLI中确实无法做到这一点,那么设置应用程序/线程(即DLL或exe?)以处理它并获取数据的最简单方法是什么?本机和托管线程/应用程序之间?
答案 0 :(得分:3)
您确实需要整个线程无CLR。只要任何托管代码在线程上运行,它就会被添加到CLR的线程列表中,以便在收集期间暂停。
但是,你的最后一个问题表明你对多线程没有任何线索。线程和DLL之间没有对应关系。 DLL可以有很多线程,每个线程都可以运行来自许多DLL的代码(事实上,如果算上Windows DLL,总是会这样做)。你也没有以通常的方式使用短语“临界区”。
混合模式C ++ / CLI程序集可以包含纯本机线程(使用本机CreateThread调用启动它,传递本机线程过程,并且不直接或间接地从该线程调用任何托管代码)。如果你在一个或多个文件中编写本机线程的代码,而没有/ clr,那么你的生活会变得容易一点,没有托管代码可见会使得更容易避免调用它,尽管要注意可能包装的函数指针管理代表。
除此之外,使用无锁同步,例如SList,或者您的本机线程最终可能会等待已挂起用于垃圾回收的混合模式线程上的锁。除此之外,这意味着不使用任何标准共享分配器,因为它们在内部使用锁定。但是确实存在一些无锁分配器。
编辑:通过调用Marshal::GetDelegateForFunctionPointer创建包装托管代理的函数指针。在那之后,它们就像指向本机函数的指针一样(可以将它们分开),并且在这样的指针上使用函数调用操作符将导致托管代码在敏感线程上运行。在大多数情况下,这不会是一个问题,只需确保您是否使用委托作为快捷方式来生成对托管代码的回调,您可以从混合线程而不是您想要原生的线程执行此操作。 / p>
通常,您可能需要某种纯粹的本机消息传递方案来交换数据。混合线程可以进行任何必要的本机调用,您可以在所有其他线程上混合使用本机代码和托管代码,只需将时间敏感的代码保留为仅本机代码。
所有thunking应该在混合线程上发生,并且它不会延迟时间敏感的本机线程,除非混合线程持有本机线程需要的锁。因此我建议使用非锁定数据交换。
答案 1 :(得分:0)
根本无法在Windows中完成 - 抱歉。获得符合您要求的操作系统。
您需要/似乎需要的是实时操作系统。