我有一个包含标题global.hpp
的文件的项目。这些文件希望在运行期间共享和更新与整个程序相关的信息(在程序运行期间逐步收集数据,但数据字段在编译时是已知的)。现在我的想法是使用这样的结构:
#include <string>
#ifndef _GLOBAL_SESSION_STRUCT
#define _GLOBAL_SESSION_STRUCT
struct session_struct {
std::string username;
std::string password;
std::string hostname;
unsigned short port;
// more data fields as needed
};
#endif
extern struct session_struct session;
#include "global.hpp"
struct session_struct session;
int main(int argc, char* argv[]) {
session.username = "user";
session.password = "secret";
session.hostname = "example.com";
session.port = 80;
// other stuff, etc
return 0;
}
现在,包含global.hpp
的每个文件都可以阅读&amp;写下session
结构的字段并轻松共享信息。
这是正确的方法吗?
注意:对于此特定项目,不使用线程。但是请(在未来的项目和其他人阅读中)在您的回答中澄清这个(或您建议的)解决方案在线程时如何工作。此外,对于此示例/项目会话变量是共享的。但这也适用于任何其他形式的共享变量。
答案 0 :(得分:1)
这是一个可能的解决方案,但不是一个非常干净的解决方案。在session_struct
中创建单个main
并将其作为参数传递(通过引用),或者在需要访问会话数据的所有类中存储引用/副本/共享指针,要更加清晰。 / p>
当多线程发挥作用时,您必须在共享数据周围放置一个互斥锁以防止竞争条件,其中多个线程访问尝试同时访问信息。如果您将其作为参数传递,则该问题仍然存在,但您有时可以通过复制结构来避免它,以便每个线程都有一个可以更新的副本。然后在所有线程完成后合并结构。 (也许可以将其重构为可修改且不变的部分以防止某些复制。)
顺便说一下,没有必要写struct session_struct
。只需使用struct Session
进行定义,然后使用Session
。
答案 1 :(得分:0)
当项目变大时,全局变量的使用可能会产生意想不到的副作用 您应该在main中创建session_struct对象并在任何地方使用它。