0

在下面的代码片段中,我需要保护 connfd,因为它可以在accept()调用中频繁更改。

   void *deal_conn(void *arg){
      int connfd;
      connfd = *((int*)arg);
      ....

   }

   for(;;){
     connfd = accept(...);
     pthread_create(&thread, NULL, deal_conn, &connfd);
    }

我不知道在哪里锁定和解锁这个变量的互斥锁。谁能给我一些想法?谢谢!

4

3 回答 3

2

不要将地址传递connfd给每个线程,动态分配一个新的int并传递它,并free()在不再需要时让线程拥有它。由于线程不再共享相同的资源,因此不需要互斥锁:

connfd = accept(...);
if (connfd != -1)
{
    int* fd = malloc(sizeof(*fd));
    if (fd)
    {
        *fd = connfd;
        pthread_create(&thread, NULL, deal_conn, fd);
    }
}

void *deal_conn(void *arg){
   int connfd =  *((int*)arg);

   free(arg);
}
于 2013-05-17T16:14:37.017 回答
0

除了我也更喜欢使用其他人提出的动态分配的套接字描述符变量的解决方案之外,这里是对 OP 问题的回答:

void *deal_conn(void * arg)
{
  int connfd = *((int *) arg);
  /* unlock mutex here */
  ...
}

...

/* init mutex here */

for(;;)
{
  /* lock mutex here */
  int connfd = accept(...);
  if (-1 == connfd)
  {
    /* in case of error unlock mutex here, as the deal_conn() will not be called */
  }
  else
  {
    int result = pthread_create(..., deal_conn, &connfd);
    if (-1 == result)
    {
      /* in case of error unlock mutex here, as the deal_conn() will not be called */
    } 
  }

  ...
于 2013-05-17T16:23:39.040 回答
0

如何更改代码如下:

 void *deal_conn(void *arg){
          int connfd;
          connfd = (int)arg;
          ....

       }

       for(;;){
         connfd = accept(...);
         pthread_create(&thread, NULL, deal_conn, (void *)connfd);
        }

我看不到锁定 connfd 的必要性,connfd 被复制到新线程的堆栈中,而不是由线程共享。

于 2013-05-17T17:15:44.423 回答