我正在尝试用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出了什么问题?
答案 0 :(得分:3)
指针只是一个指针。你给每个线程一个指向同一个args
结构的指针。所以他们每个人都有自己的指针,但他们都指向同一个东西。因为它们都通过指针访问参数,所以它们都访问相同的参数。
您需要实际为每个人提供他们自己的结构,而不仅仅是他们自己指向同一结构的指针。使用malloc()分配一个新结构,填入它,并将其交给服务器/线程(在它死之前需要释放它)。)
答案 1 :(得分:1)
如果您能够解决gcc
特定解决方案,请考虑the __thread
storage class。
否则,请考虑使用pthread_key_create()
/pthread_get_specific()
+pthread_set_specific()
。