【问题标题】:advanced-ish C programming in Windows (pthreads, signals and semaphores, oh my!)Windows 中的高级 C 编程(pthreads、信号和信号量,哦,我的!)
【发布时间】:2013-07-04 13:03:29
【问题描述】:

我正在学习计算机科学的第三年,所以我可能应该已经知道这个问题的答案,但我不知道。无论如何,我目前正在攻读操作系统课程,我们一直在学习许多新的编程概念,例如 C 中的信号、信号量和线程。不幸的是,我的教授在 Linux/OS 中涵盖了所有这些X 视角。这对我来说意味着,在 64 位 Windows 机器上,安装警报信号或使用信号量和 pthread 之类的东西不会在我的机器上编译或运行(据我所知)。

不管怎样,目前我只是在一个运行 Linux 的 VM 中完成我的作业,到目前为止它运行良好,但我更喜欢 Windows 环境进行编码。

所以,在冗长的介绍之后,我的问题是,正如您可能已经猜到的那样,有没有一种方法可以对所有这些功能(警报信号、信号量、pthread 等)进行编码并能够编译和测试它们在 Windows 中?我完全知道 Windows 操作系统不支持警报信号并且 POSIX 功能有限,但我听说过关于 cygwin 的谣言(我确实尝试过工作,但不是很努力:P)和 micro可以在后台运行以使用这些功能的 Linux 内核。

无论如何,如果有人可以给我一个他们会推荐的选项列表(最好不要坚持使用您的虚拟机,即使我认为这可能是我的最佳选择),也许还有一些提示、优点、缺点,也许是设置指南,或者这些选项的任何非空子集,我将不胜感激。另外,在你问之前,我们必须在我们的作业中使用 C 和上面提到的编程特性,所以很遗憾没有切换到 Java 或 win32 选项中的代码:(

提前感谢任何可以提供一些智慧之言的人:)

【问题讨论】:

  • 我认为 Raspberry Pi 系统的成本约为 60 欧元,并且能够运行 Linux。您可以使用例如远程编程它SSH 或 Cygwin 的 X 服务器。这是一个不错的玩具!
  • 另一个类似于 VM 但在我看来比较麻烦的选项是使用 Amazon Web Services。如果您的作业计算成本不高,您可以在 AWS 上的微型实例上免费运行它们。那里有一个小的学习曲线,但是一旦在那里,它是一种很好的方式,可以在需要时从 Windows 访问 linux 机器,而不会给你的机器带来额外的压力

标签: c windows multithreading operating-system posix


【解决方案1】:

基本原则都在 Windows 中,但做法不同。我建议,如果您要为 Windows 编程,请在 Windows API 中执行此操作,而不是通过像 Cygwin 这样的仿真层。如果有的话,您很快就会了解到不同的操作系统采用不同的方法来处理信号和进程。

首先要注意的是,Windows 中的线程要轻得多,而进程要重得多。考虑到这一点,Windows 程序在使用线程时运行效率最高。您应该非常熟悉CriticalSection 的概念。还有Semaphore Object。继续阅读 API,您会发现有关这些主题的大量信息 - Microsoft 文档实际上相当不错。要了解 Windows API 的一个关键点是,您几乎总是必须“创建/获取”一个新对象(并获得一个句柄),然后才能使用它。而且 Windows 不喜欢有太多句柄的程序。

我个人喜欢 POSIX API 并且热爱 Linux。但我很感激,如果你想在 Windows 中正确地做事,你应该使用 Windows 操作系统 API——尽管结果和方法可能有些不同,但他们已经仔细考虑了这一点。

PS Windows 没有“警报”。这可能是简单地将 Unix/Linux 实用程序移植到 Windows 的最大障碍。 (事实上​​,Windows 进程在使用它之前必须“引导” Internet/socket 支持,而 Linux 进程则很好)。

【讨论】:

  • 其实我知道Windows API的功能,但是因为这是给学校的,我需要使用教授使用的。这意味着我需要对所有信号、信号量和线程使用 POSIX API,并且我的分配提交应该在 Linux(实际上是 Unix)机器上运行时正常运行。所以,基本上 Windows API 不是我的选择。因此,非常感谢在 Windows 中运行这些 POSIX 功能的任何其他选项:)
  • 就我个人而言,我最简单的方法是 Colinux,它将 Linux VM 作为 Windows 进程运行(因此您可以在运行 Windows 的同时在 Windows 中运行 Linux)。但是,您已经有一个 VM。并且 CoLinux 可能会遇到 64 位主机操作系统的问题。这些天来,所有的孩子都在使用别的东西……也许是 VirtualBox?我不记得了。
【解决方案2】:

MinGW-w64 - GNU 工具链的 Windows 端口 - 和 Pthreads-win32,Windows 线程 API 的 POSIX 包装器。

我通过mingw64-x86_64Cygwin 交叉编译器包(目前提供有点过时的 gcc 4.5.3)而不是直接使用这些,原因有两个:首先,我需要 GNU 工具箱中的其他东西,其次因为包管理器。

我不确定 Pthreads-win32 在多大程度上符合 POSIX,但我可以确认 LLVM 和 Clang 都可以使用此设置进行编译。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-08-29
    • 2014-08-16
    • 2011-01-05
    • 1970-01-01
    • 2013-12-12
    • 1970-01-01
    相关资源
    最近更新 更多