0

我正在尝试在 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在线程中使用变量而不让其他线程修改它的内容?

编辑:

我试图复制内存,但运气不佳:

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

我的malloc有问题吗?

4

2 回答 2

3

指针只是一个指针。你给每个线程一个指向相同args结构的指针。所以他们每个人都有自己的指针,但他们都指向同一个东西。由于它们都通过指针访问参数,因此它们都访问相同的参数。

您实际上需要为它们中的每一个赋予自己的结构,而不仅仅是它们自己指向同一结构的指针。使用 malloc() 分配一个新结构,填充它,然后将其交给服务器/线程(它需要在它死亡之前释放()它。)

于 2013-10-08T02:10:52.530 回答
1

如果您可以胃特定gcc解决方案,请考虑存储类__thread

否则,请考虑使用pthread_key_create()/ pthread_get_specific()+pthread_set_specific()

于 2013-10-08T02:15:35.177 回答