我想我的问题很常见,但它让我发疯:
我有一个包含5个线程的多线程应用程序.其中4个线程完成它们的工作,如网络通信和本地文件系统访问,然后将它们的输出写入此表单的数据结构:
struct Buffer {
std::vector<std::string> lines;
bool has_been_modified;
}
Run Code Online (Sandbox Code Playgroud)
第5个线程将这些缓冲区/结构打印到屏幕:
Buffer buf1, buf2, buf3, buf4;
...
if ( buf1.has_been_modified ||
buf2.has_been_modified ||
buf3.has_been_modified ||
buf4.has_been_modified )
{
redraw_screen_from_buffers();
}
Run Code Online (Sandbox Code Playgroud)
如何保护缓冲区在被读取或写入时不被覆盖?
我找不到合适的解决方案,虽然我认为这必须是一个安静的常见问题.
谢谢.
我有一个游戏或任何带有服务器和多个客户端的远程用户界面,它们应该通过网络进行通信。 客户端和服务器都应该能够异步发送更新。
这似乎是一个非常自然的服务定义,让 grpc 管理会话。
syntax = "proto3";
package mygame;
service Game {
rpc participate(stream ClientRequest) returns (ServerResponse);
}
message ClientRequest {
// Fields for the initial request and further updates
}
message ServerResponse {
// Game updates
}
Run Code Online (Sandbox Code Playgroud)
实现客户端很简单(尽管下面的代码显然是不完整和简化的)。
syntax = "proto3";
package mygame;
service Game {
rpc participate(stream ClientRequest) returns (ServerResponse);
}
message ClientRequest {
// Fields for the initial request and further updates
}
message ServerResponse {
// Game updates
}
Run Code Online (Sandbox Code Playgroud)
看起来困难的是在不阻塞的情况下实现服务器。
class Client: …
Run Code Online (Sandbox Code Playgroud)