在文件之间共享运行时变量

时间:2011-03-16 16:04:36

标签: c++ scope session-variables

我有一个包含标题global.hpp的文件的项目。这些文件希望在运行期间共享和更新与整个程序相关的信息(在程序运行期间逐步收集数据,但数据字段在编译时是已知的)。现在我的想法是使用这样的结构:

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;

的main.cpp

#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结构的字段并轻松共享信息。

这是正确的方法吗?

注意:对于此特定项目,不使用线程。但是请(在未来的项目和其他人阅读中)在您的回答中澄清这个(或您建议的)解决方案在线程时如何工作。此外,对于此示例/项目会话变量是共享的。但这也适用于任何其他形式的共享变量。

2 个答案:

答案 0 :(得分:1)

这是一个可能的解决方案,但不是一个非常干净的解决方案。在session_struct中创建单个main并将其作为参数传递(通过引用),或者在需要访问会话数据的所有类中存储引用/副本/共享指针,要更加清晰。 / p>

当多线程发挥作用时,您必须在共享数据周围放置一个互斥锁以防止竞争条件,其中多个线程访问尝试同时访问信息。如果您将其作为参数传递,则该问题仍然存在,但您有时可以通过复制结构来避免它,以便每个线程都有一个可以更新的副本。然后在所有线程完成后合并结构。 (也许可以将其重构为可修改且不变的部分以防止某些复制。)

顺便说一下,没有必要写struct session_struct。只需使用struct Session进行定义,然后使用Session

答案 1 :(得分:0)

当项目变大时,全局变量的使用可能会产生意想不到的副作用 您应该在main中创建session_struct对象并在任何地方使用它。