防止线程特定数据被覆盖C

时间:2013-10-08 02:05:00

标签: c multithreading

我正在尝试用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出了什么问题?

2 个答案:

答案 0 :(得分:3)

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

您需要实际为每个人提供他们自己的结构,而不仅仅是他们自己指向同一结构的指针。使用malloc()分配一个新结构,填入它,并将其交给服务器/线程(在它死之前需要释放它)。)

答案 1 :(得分:1)

如果您能够解决gcc特定解决方案,请考虑the __thread storage class

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