Совместное использование переменных времени выполнения между файлами - PullRequest
0 голосов
/ 16 марта 2011

У меня есть проект с несколькими файлами, которые все включают заголовок 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, может просто читать и записывать поля структуры session и легко обмениваться информацией.

Это правильный способ сделать это?

ПРИМЕЧАНИЕ : Для этого конкретного проекта не используется многопоточность. Но, пожалуйста, (для будущих проектов и других людей, читающих) уточните в своем ответе, как это (или ваше предлагаемое) решение работает, когда есть нить. Кроме того, для этого примера / проекта переменные сеанса являются общими. Но это также должно относиться к любой другой форме общих переменных.

Ответы [ 2 ]

1 голос
/ 16 марта 2011

Это возможное решение, но не очень чистое. Создание одного session_struct в main и передача его в качестве аргумента (по ссылке) или сохранение ссылок / копий / общих указателей во всех классах, которым требуется доступ к данным сеанса, намного чище.

Что происходит, когда в игру вступает многопоточность, так это то, что вам нужно разместить мьютекс вокруг общих данных, чтобы предотвратить состояние гонки, когда несколько потоков пытаются одновременно получить доступ к информации. Если вы передадите его в качестве аргумента, эта проблема все еще существует, но иногда вы можете избежать ее, скопировав структуру, чтобы каждый поток имел копию, которую он может обновить. Затем объедините структуры после завершения всех потоков. (Может быть, реорганизовать его в изменяемые и постоянные части, чтобы предотвратить копирование.)

Кстати, нет необходимости писать struct session_struct. Просто определите его с помощью struct Session и используйте как Session.

0 голосов
/ 16 марта 2011

использование глобальных переменных может иметь неожиданные побочные эффекты, когда ваш проект становится большим Вы должны создать объект session_struct в вашем main и использовать его везде.

...