- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我已经为缓冲网络套接字 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/
我正在尝试弄清楚如何让一个成员变量代表传入的 istream 或类自己创建的成员变量。 我认为,如果我动态分配类创建的 istream,那么使用指向 istream 的指针可能会起作用;然而,问题在于
我正在尝试理解这段代码 istream &read(istream &is, Sales_data &item) { double price = 0; is >> item.b
我编写了一个实现 IStream(COM 接口(interface)而不是 C++ 标准库类)的过滤器。这一切都很好,但我的问题是我不确定何时(如果有的话)我可以确定不会发送进一步的 IStream
我正在测试 C++PL 书中的一段代码并找到了下一段代码(我不想感觉我是在将它从书中复制粘贴到我的 IDE,所以我至少改变了变量名): istream& operator>> (istream& is
我正在阅读 C++ Practical Programming by Example by Andrew Koenig (Author)并在 4.1.3 Reading homework grades
我正在尝试使用 istream& getline 而不是使用 istream& operator 从文件中读取行。 结果cpp #include "Result.h" Result::Result()
我试图通过套接字连接发送图像,但我遇到了以下代码的问题: //stream to char array STATSTG myStreamStats; ULONG bytesSaved; myStrea
这里有两段代码,我起初认为它们应该是等价的: { std::ifstream stream("test.bin", std::ios_base::in | std::ios_base::bin
我在网上查了,但没找到合适的。 怎么可能有这样的主线(原始主线): int main() { Image left; std::ifstream ifs("l
假设我有以下代码: std::ifstream file(name, flags); file.seekg(0, std::ios::beg); // Check for error file.rea
在 Windows 上的 C++ 中,是否有任何简单的方法可以为现有 std::stream 对象创建 (COM) IStream 接口(interface)? 一个示例是使用 IWICStream:
考虑以下简单程序,它将输入拆分为空白并每行打印出一个非空白标记: #include int main(int argc, char* argv[]) { while (std::ci
istream& getline (istream& is, string& str); 此处 str 在换行符后终止。但是,如果我想处理 str cotents 2-3 行的情况,那么还有什么选择呢
这个问题已经有答案了: Java multiple file transfer over socket (3 个回答) 已关闭 5 年前。 我正在编写一个程序在两台计算机之间传输文件,但我没有关闭套接
void transferData(ifstream& input_file, ofstream& output_file) { char ch; while (input_file
我正在读取包含以下行的文本文件: deltaT 0.005; 在字符串中找到正确的行后,我想使用如下代码读出该值: double deltaT;
我正在查看 istream 类,但没有看到可以完全清除缓冲区并将输入设置为为下一个“干净”输入做好准备的方法。 我为我的类定义了提取运算符,在我的主程序中我要求用户输入,如下所示: while (tr
我正在编写一个解析器,之前我在尝试解析标识符(任何对 C++ 变量名有效的东西)和未闭合的字符串文字(任何以 " 开头的东西)时遇到了麻烦,但是在我的输入末尾缺少结束符 ")。我认为这是因为词法分析器
我得到了一个具有以下签名的函数。我无法改变它,我必须接受它。 void parse(std::istream & in); 我应该测试这个函数,所以基本上用预定义的内容调用它并检查值是否被正确解析。因
我的运算符(operator)有问题>> istream& operator>> (istream& is, Matrix& M) { char first; is>>first;
我是一名优秀的程序员,十分优秀!