【问题标题】:Make datastream from thread readable for all other threads使来自线程的数据流对所有其他线程都可读
【发布时间】:2019-02-20 17:28:05
【问题描述】:

我必须在多线程服务器实例的客户端下分发数据流,客户端线程只需要读取。这意味着我有一个数据来自的线程,所有其他线程都需要读取该数据(他们不必再更改它),以便他们可以将数据发送给客户端。

我尝试了一个线程安全队列 (https://blog.chrisd.info/a-simple-thread-safe-queue-for-use-in-multi-threaded-c-applications/),但是当我尝试使用多个客户端时,只有第二个或新的客户端接收到数据。

我该如何解决这个问题?是否有可以在多个线程中使用的线程安全队列?

卢克

【问题讨论】:

  • 如果读取线程处理数据的速度与写入线程产生数据的速度一样快,那么就会发生这种情况。你不说是不是这样。
  • 啊,我明天测试一下,谢谢! (目前阅读和制作速度一样快)
  • 这取决于您的情况,但可能使用shared_ptr 保存数据。它只是一个经常被替换的数据块吗?它是一个持续的数据流还是一组需要不时更新的固定数据?

标签: c++ multithreading queue pthreads posix


【解决方案1】:

正如您所描述的,通常的队列语义将不起作用,因为您实际上希望在所有线程都获得元素时弹出元素,而不是在第一次访问时。所以你有几个选择:

  • 为每个客户端线程维护一个队列,生产者线程始终将数据推送到每个客户端线程。通过将数据包装到 std::shared_ptr 中,您可以减少内存开销并创建语义,当最后一个客户端完成数据时,数据将被销毁。
  • 有一个队列,但每个线程有多个尾指针。尽管在线程产生/终止时处理线程可能会变得复杂。但是您还没有说明系统中的限制条件 - 线程数是固定的还是动态的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-16
    • 1970-01-01
    相关资源
    最近更新 更多