gpt4 book ai didi

c++ - 具有共享 streambuf 的 istream 和 ostream 对于双工 I/O 是相互线程安全的吗?

转载 作者:可可西里 更新时间:2023-11-01 18:38:00 27 4
gpt4 key购买 nike

我已经为缓冲网络套接字 I/O 派生了一个自定义 streambuf,覆盖下溢、上溢和同步,以便下溢与其他两个集相互线程安全,(我有单独的输入和输出内部缓冲区).这工作正常,但我想将它用于全双工 I/O,其中一个线程可以输入而另一个线程正在输出,所以我想使用 istream 作为接收线程,使用 ostream 作为发送线程,同时共享网络streambuf 因为它抽象了所有套接字的东西。我的问题是,如果输入和输出缓冲区是分开的,streambuf 成员在多大程度上受 istream 上的输入操作的影响与受 ostream 上的输出操作影响的 streambuf 成员脱节?

能够做到这一点会更好,而不是必须将套接字的东西从我的 streambuf 抽象中分离出来,这样套接字就可以在 istream 和 ostream 之间使用单独的 streambuf 共享——那么我还需要两个版本的streambuf——一个具有单个内部缓冲区(仅用于 istream 或仅用于 ostream),另一个具有两个内部缓冲区,如我现在所拥有的,用于 iostream...很糟糕,因为这是额外的类和代码重复。

最佳答案

std::streambuf没有特别保证(或 std::basic_streambuf<...> )提供比通常提供的更多的保证。也就是说,您可以让多个线程随时读取对象的状态,但如果有一个线程修改对象的状态,则不会有其他线程访问该对象。读取和写入字符都会修改流缓冲区的状态,即从正式的角度来看,没有外部同步就无法使用它们。

在内部,这两个缓冲区是完全独立的,彼此没有任何关系。流缓冲区上的操作以一种相当结构化的方式修改它们,我无法想象任何实现都会在两组指针之间进行显式交互。也就是说,实际上我认为读写之间没有任何必要的同步。然而,我之前没有意识到这两组缓冲区指针实际上可能共享相同的缓存行,这至少可能会导致性能问题。我认为这不会导致任何正确性问题。

两个流缓冲区之间唯一可能共享的资源是 std::locale然而,这意味着是无状态的对象。另外,std::streambuf不使用此对象本身:它是您的流缓冲区,它可能使用某些方面(例如 std::codecvt<...> 方面)。由于通过调用虚函数 imbue() 更改了语言环境如果您的流缓冲区使用语言环境,您将能够拦截此更改并执行任何需要的同步。

总而言之,该标准不保证使用并发线程来读取和写入相同的流缓冲区。实际上,DS9k 可能是唯一会失败的系统,并且由于缓冲区指针在共享缓存行中结束,两个线程可能最终有效同步。

关于c++ - 具有共享 streambuf 的 istream 和 ostream 对于双工 I/O 是相互线程安全的吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9963413/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com