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

时间:2013-08-04 20:22:29

标签: c# c pthreads posix

如果我创建了一个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

2 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

在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。