глобальная структура и несколько потоков в c

#c #windows #struct #global

#c #Windows #структура #глобальная

Вопрос:

кто-нибудь может объяснить мне ошибку компиляции в этом коде:

 #include "common.h"

typedef struct nodeData {
    int procid;
    unsigned short localport;
    DWORD LIFETIME;
    DWORD HELLOTIMEOUT;
    DWORD MAXTIME;
} nodeData;

int listenerThread() {
    if(!bindSocket(listenSocket,nodeData.localport)){
        closesocket(listenSocket);
        WSACleanup();
        exit(-1);
}
    // more code goes here  
}

int main(int argc,char* argv[]) {
    nodeData.localport = 5001;
    // more code goes here  

}
  

Я хочу, чтобы структура nodeData была доступна для каждого listenerThread, который я создам. потоки будут постоянно манипулировать этой структурой nodeData (защитят ее мьютексом).

итак, я хочу, чтобы эта структура была доступна глобально. где мне ее инициализировать? мое предположение в основном.

ошибка компиляции в строке

 nodeData.localport = 5001;
  

является

ошибка: нестатическая ссылка на элемент должна относиться к определенному объекту

чего я здесь не понимаю ?

Спасибо!

Ответ №1:

nodeData является типом, а не переменной — поскольку вы typedef это. Попробуйте, например,:

 typedef struct nodeData_t {
    int procid;
    unsigned short localport;
    DWORD LIFETIME;
    DWORD HELLOTIMEOUT;
    DWORD MAXTIME;
} nodeData;

nodeData MyNodeData;
  

А затем используйте переменную MyNodeData

Комментарии:

1. Клянусь , я не поднимал ваш ответ 🙂 … мы просто, по-видимому, используем тот же случай camel.

2. большое спасибо за быстрый ответ. простите меня за невежество, но это всегда меня смущает, разве запись nodeData не выполняется сразу после определения структуры, уже создающей ее экземпляр?

3. @michael: Нет, не тогда, когда у вас есть typedef впереди. struct nodeData {} MyNodeData; создал бы экземпляр

4. @Erik, я вижу, спасибо. и что представляет nodeData_t ? я не знаком с этим синтаксисом. это просто для того, чтобы отличать nodeData от структуры nodeData, которая появляется после объявления структуры?

5. @michael: Да. Лично я никогда не использую одно и то же имя для структуры, это typedef и экземпляр.

Ответ №2:

Не вдаваясь в то, почему вы не должны использовать глобальную переменную для этого, вы нигде не создавали глобальную переменную, только определили структуру и ввели в нее typedef’d.

Перед main вам нужно будет выполнить:

 nodeData myNodeData;
  

И получить к ней доступ как myNodeData

Комментарии:

1. спасибо, что вы предлагаете мне сделать вместо этого? должен ли я определять структуру внутри main? смогут ли другие потоки, вызываемые из main, использовать ее?

2. Обычно вы хотите избежать глобальных значений. Не только с точки зрения памяти, но и для удобства чтения и инкапсуляции данных. Создание экземпляра структуры в main и передача указателя на нее вашим потокам были бы обычным подходом.

3. откуда потоку знать структуру, которая была определена в main ? поток не определен в той же области main…

4. Затем вы бы создали ее экземпляр везде, где вы создаете свои потоки. Если после этого вы вернетесь к main, вам нужно будет либо создать ее в куче с помощью malloc , чтобы избежать проблем с областью видимости, либо по-прежнему создавать ее в main и передавать указатель туда, где вы создаете свои потоки. (Не видя вашего кода, на этот вопрос сложно ответить конкретно). Что касается глобальных переменных, это довольно хорошее чтение: глобальные переменные плохие