Dis*_*ame 7 c++ sockets multithreading iostream stream
我已经为缓冲网络套接字I/O派生了一个自定义streambuf,覆盖了下溢,溢出和同步,因此下溢与其他两个的集合是相互线程安全的(我有单独的输入和输出内部缓冲区).这工作正常,但我想将它用于全双工I/O,其中一个线程可以输入而另一个线程输出,所以我想使用istream作为接收线程,使用ostream作为发送一个,同时共享网络streambuf因为它抽象了所有套接字的东西.我的问题是,如果输入和输出缓冲区是分开的,那么受流量输入操作影响的streambuf成员在多大程度上会受到受流量输出操作影响的streambuf成员的影响?
最好是能够做到这一点,而不是必须将套接字东西与我的streambuf抽象分开,这样套接字可以在istream和ostream之间使用单独的streambuf共享 - 那么我还需要两个版本的streambuf--一个带有单个内部缓冲区(仅用于istream或仅用于ostream),另一个带有两个内部缓冲区,如我现在所用,用于iostream ...因为它的附加类和代码重复很糟糕.
没有为std::streambuf
(或std::basic_streambuf<...>
) 提供特殊保证,但它提供的保证比一般提供的保证更多。也就是说,您可以随时让多个线程读取对象的状态,但如果有一个线程修改对象的状态,则不应有其他线程访问该对象。读取和写入字符都会修改流缓冲区的状态,即从形式角度来看,如果没有外部同步,就无法使用它们。
在内部,两个缓冲区是完全独立的,彼此无关。流缓冲区上的操作以相当结构化的方式修改它们,我无法想象任何实现都会在两组指针之间进行显式交互。也就是说,实际上我认为阅读和写作之间没有必要同步。然而,我之前没有意识到两组缓冲区指针实际上可能共享相同的缓存行,这至少可能会导致性能问题。我认为这不会导致任何正确性问题。
然而,两个流缓冲区之间可能共享的唯一资源是std::locale
无状态的对象。另外,std::streambuf
不使用该对象本身:它是您的流缓冲区,可能会使用某些方面(例如方面std::codecvt<...>
)。当通过调用虚拟函数更改区域设置时,imbue()
如果您的流缓冲区使用该区域设置,您将能够拦截此更改并执行所需的任何同步。
总之,该标准不保证使用并发线程使用相同的流缓冲区进行读写是可行的。实际上,DS9k 可能是唯一会失败的系统,并且由于缓冲区指针最终位于共享高速缓存行中,两个线程可能最终有效同步。
归档时间: |
|
查看次数: |
2216 次 |
最近记录: |