将Posix线程转换为C#线程,反之亦然

本文关键字:线程 反之亦然 转换 Posix | 更新日期: 2023-09-27 18:26:16

如果我制作了一个c++函数并将其编译成一个dll,它看起来像这样:

public pthread& NanoSleep(pthread& myThread)
{
    nanosleep(1);
    return myThread;
}

有没有一种方法可以在任何人都能想到的c#类中使用它?传递线程真的有必要吗?我基本上想让一个c线程休眠1纳秒。没有真正的功能性理由这样做。我只是想知道它是否可以做到:)

注意:如果C++/CLI能够处理好它,那就太棒了。http://www.codeproject.com/Articles/19354/Quick-C-CLI-Learn-C-CLI-in-less-than-10-minutes#A8

将Posix线程转换为C#线程,反之亦然

.NET使用"托管线程"。在后台,这些都是由特定于平台的线程实现的。例如,Windows上的Win32线程。不过,托管线程和特定于平台的线程之间没有一对一的映射;托管线程可以在平台线程和处理器内核之间移动。我假设Mono在Linux上通过pthreads实现托管线程。但是,即使您确定了托管线程当前运行的pthread,也无法使用它可靠地暂停托管线程。

在windows上使用c++/CLI应该允许您将pthread封装在托管类中(比如称之为Posix.NET.Thread),并使用.NET.中提供的System.Threading.Thread的

我怀疑,即使在上面的C/C++代码中,pthread实际上也是下面的Windows线程,但我不知道。

在Linux上,您可以使用Mono.NET,我非常确信在Linux上底层的System.Threading.Thread的实现将是pthread。这是dtb所暗示的,但也指其他问题。我无法证实这一点,但如果不是这样,我会感到惊讶。

如果您的目标实际上是获得亚毫秒的时间分辨率,那么无论如何都不希望只依赖线程睡眠调用(托管或pthread)。

在windows上,在c++中有一个高分辨率计时器:http://msdn.microsoft.com/en-us/library/aa964692%28v=vs.85%29.aspx

在.NET(c#)中有一个System.Diagnostics.Stopwatch类,它封装了高分辨率计时器。

因此,如果需要等待>~30ms,您可以休眠线程,然后轮询高分辨率计时器以获得高于~30ms的分辨率。