【问题标题】:pthread_create in multithreaded http server多线程 http 服务器中的 pthread_create
【发布时间】:2020-12-11 08:05:26
【问题描述】:

假设服务器以如下方式处理客户端:

void* handle_request(void* client_sck);

int client_sck;

while((client_sck = accept(...)) != -1)
{
    /*
    .
    .
    .
    */
    
    pthread_create(&thr, 0, handle_request, (void*)&client_sck);    
}

是否可以肯定地说,在每次循环迭代中,传递给pthread_create 的最后一个参数将在线程之间共享?这意味着第二次,client_sck 仍然具有与上一次迭代相同的地址。

【问题讨论】:

  • 你引用的是同一个变量,为什么地址会改变?但是,这很可能不是您想要的。
  • 您知道 apache httpd(和其他)是开源的吧?你可以去看看。
  • 地址不会改变,但解引用的值会不同。如果第一次创建的线程还没有取消引用它,那将是一个问题:(
  • 因此,我们可以得出结论,这不是处理客户端连接的最聪明的方法,因为地址本质上是相同的,但每次迭代都会覆盖该值。在调用pthread_create 之前,malloc 是否为每次迭代添加一个新参数? @Nic3500 我很好奇 http 服务器的一个更简单的例子,而不是一个成熟的项目。主要是由于pthread_create的性质

标签: c unix pthreads


【解决方案1】:

是的。这意味着 next accept() 可以在 previous 线程有机会获取该值之前覆盖该值,因此这不是一个好的设计。

【讨论】:

  • 您如何看待这种方法? stackoverflow.com/questions/8719888/… 我从未练习过将int 转换为void*(反之亦然)。该答案的 cmets 表明它不会产生我在问题中描述的问题,并避免使用malloc
猜你喜欢
  • 1970-01-01
  • 2022-01-23
  • 1970-01-01
  • 2011-08-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-09-25
相关资源
最近更新 更多