2013-10-08 3 views
0

Я пытаюсь создать простую программу чата в C. Для каждого клиента я создаю новый поток, чтобы сервер мог обрабатывать связь с несколькими пользователями одновременно. Я храню каждые пользовательские данные в stucture следующим образом:Предотвращение зависания конкретных данных от перезаписи C

struct User      /*structure to handle all clients*/ 
{ 
    int port; 
    char username[10]; 
    struct User*connected; 
    struct User*next; 
}; 

В основном потоке, я создаю новый поток и передать в структуре для пользователя:

pthread_create(&thr,NULL,server,(void*)&args); 

Это делается для каждого пользователь.

Теперь, когда создается каждый новый поток, я копирую структуру пользователя из аргументов, которые будут использоваться в потоке.

void *server(void * arguments) 
    { 
      struct User*cur_user = arguments; 
    } 

Это прекрасно работает для первого пользователя, однако, когда новый пользователь присоединяется, информация из аргументов переписывается.

Я понимаю, что потоки обмениваются данными в программе. Однако есть ли способ скопировать аргументы и их же в локальную переменную в потоке, чтобы они были только областью потоков? Другими словами, как я могу использовать переменную cur_user в потоке, не изменив ее содержимое другими потоками?

EDIT:

Я попытался скопировать память, но я не много удачи:

struct User args;      
     struct User*new_arg = malloc(sizeof(struct *new_arg)); 
     memcpy(new_arg, *args, sizeof(new_arg)) 

что-то не так с моей таНос?

ответ

3

Указатель - это просто указатель. Вы указываете каждому потоку указатель на ту же структуру args. Поэтому каждый из них имеет свой собственный указатель, но все они указывают на одно и то же. Поскольку все они получают доступ к аргументам через свой указатель, все они получают доступ к тем же аргументам.

Вам нужно на самом деле дать каждой из них свою структуру, а не только их собственный указатель на ту же структуру. Выделяет новую структуру с таНос(), заполнить его и передать его на сервере/поток (который должен освободить(), прежде чем он умрет.)

+0

Благодарим за помощь. У меня возникли проблемы с распределением новой памяти. Я добавил комментарии выше –

+0

@AdamJakiela: Либо 'sizeof * new_arg', либо' sizeof (struct User) '. Я предпочитаю первый. Кроме того, назначение работает, нет необходимости в memcpy. '* new_arg = arg;' просто отлично. – rici

Смежные вопросы