代码之家  ›  专栏  ›  技术社区  ›  iolo

如何释放通流堵塞的螺纹

  •  1
  • iolo  · 技术社区  · 14 年前

    我创建了两个类。一个用于输入读取(通过istream对象)和解析,另一个用于处理解析器的输出。
    每种情况都有一个例子。
    我让解析器在一个循环中运行,调用istream::get(),然后根据输入为第二个对象创建命令。然后将这些命令放到队列中,第二个对象在单独的线程中处理该队列。
    现在很明显,我最终需要能够发送一个“Quit”命令。但是,这里出现了一个问题:“Quit”命令也需要结束解析循环,但是我找不到一种方法来通知解析器它应该退出,因为它被istream::get()捕获。
    我需要一种方法来唤醒它,但我找不到任何。。。

    在StackOverflow的另一个问题中,我看到了Boost库的asio类,但是我不希望依赖第三方库。
    是否有方法从istream::get()唤醒线程-即是否有方法从程序中写入istream缓冲区(可能假设它实际上是cin)?
    另一种方法是杀死线程,因为在特定的地方不需要清理,所以我也可以找到可以接受的线程。但这怎么能做到呢?(我依赖于POSIX线程实现)

    2 回复  |  直到 14 年前
        1
  •  1
  •   Marcelo Cantos    14 年前

    您将不得不依赖标准iostream类以外的其他类,因为它们不提供 select() -风格行为。

    pthread_cancel() ,但在您的情况下,它可能卡在无法取消的系统调用中。你特别感兴趣, read() 根据环境的不同,可以取消,也可以不取消。 At least one environment 说取消点 发生于 ,但不可否认,它是一个Windows POSIX层。另外,Mac OS X,最近 Leopard 10.5.1 ,已经断了 读取() 关于可取消性的实现。

    一旦越过这个障碍,你还必须考虑 uneasy relationship C++析构函数与pthRead取消之间。并非所有的环境都保证析构函数被调用,所以在C++代码中使用pthRead取消时,必须非常谨慎。

    选择() :一个fd用于I/O,另一个fd(由 pipe() )用于发送信号。或者,如果你很勇敢,使用 AIO ,但最好使用高级接口,如 Boost.Asio .

        2
  •  1
  •   Rune Baess    14 年前

    有可能在.NET中实现吗?-如果是的话,看看 Reactive Framework . 它提供了一种非常优雅的处理方式 溪流 取消 -除此之外,您还可以得到一个非常可扩展的Linq扩展库,用于各种类型的东西,比如缓冲、记忆、压缩等等。。

    创意团队的杰夫有很多关于 Streaming and Reative here :

    推荐文章