【问题标题】:Converting Posix Threads to C# Threads and vice versa将 Posix 线程转换为 C# 线程,反之亦然
【发布时间】:2013-08-04 20:22:29
【问题描述】:

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

【问题讨论】:

标签: c# c pthreads posix


【解决方案1】:

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

【讨论】:

  • 这基本上就是你要说的吗(抱歉,这有点过头了哈哈):使用 c++/cli 时 pthreads 不编译为 .net 线程?
【解决方案2】:

在 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的分辨率。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-06-15
    • 2017-06-11
    • 2015-06-28
    • 1970-01-01
    • 1970-01-01
    • 2010-12-03
    • 2011-10-08
    相关资源
    最近更新 更多