【问题标题】:how to pass multiple arguments to thread for client server in c?如何在c中将多个参数传递给客户端服务器的线程?
【发布时间】:2015-05-07 14:25:57
【问题描述】:

我想创建一个并发服务器来处理多个客户端请求。所以我创建了一个线程函数来处理多个请求。我的问题是我有一个哈希表,它最初在服务器启动时加载文件的内容,并且我也有套接字描述符和文件描述符。那么如何传递给线程函数。存储参数并传递给线程是否需要结构?

我的代码是这样的:

struct UserData
{
    char *username; 
    char *password;

};

struct HashTable
 {
    int size;
    struct UserData *table
 };

int main()
{
 struct HashTable *htable;
  //socket sd to open socket in server
  and a Fd file descriptor to write to file
 // hash table loaded with contents and it is a structure
 /*create thread using pthread*/
 pthread_create(...,fun,..);

 }

 void * fun(void *arg)
 {
  .............
  }

我如何声明一个结构以传递给线程函数,包括套接字描述符(sd)、文件描述符(fd)和哈希表指针等参数?当我写入文件(fd)时,我会使用互斥锁来锁定吗?

【问题讨论】:

  • 你的问题真的是“我如何声明一个结构吗?”您已经在上面证明了您知道如何声明结构。你在问什么?
  • 您只是不知道如何将这些值包装到结构中并将其传递给线程函数?所有线程是否共享相同的 fd/sd(因为您询问的是锁)?

标签: c multithreading sockets


【解决方案1】:

pthread_create()void * 作为其最后一个参数,该参数将传递给您的线程入口函数,在您的情况下为fun()。因此,您只需要定义一个包含您要传递的所有字段的结构:

struct ThreadArg {
    int sd; /* socket descriptor */
    int fd; /* file descriptor */
    struct HashTable *ht;
};

然后在您的main() 中填写并传递给pthread_create()

...
struct ThreadArg *arg = malloc(sizeof(struct ThreadArg)); /* you should check for NULL */
arg->sd = sd;
arg->fd = fd;
arg->ht = htable;
pthread_create(..., fun, (void *)arg);
...

然后在 fun() 中你将它回退:

void *fun(void *arg) {
    struct ThreadArg *thArg = (struct ThreadArg *)arg;
    /* do whatever with thArg->sd, thArg->fd, etc. */
    ...
    /* free the memory when done */
    free(arg);
}

【讨论】:

  • 如何将值分配给 struct HashTable .. 是否像 tharg->ht-= malloc(sizeof(struct HashTable)) 并且我可以分配 tharg->ht->table=malloc(size * sizeof(struct UserData)) 也喜欢
  • 也像这样 for (i = 0; i size; i++) { htable->table[i].username = NULL; htable->table[i].password = NULL; }
猜你喜欢
  • 2016-05-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-05-17
  • 2012-01-03
  • 1970-01-01
  • 2015-01-09
  • 2019-04-18
相关资源
最近更新 更多