在多线程程序中选择互斥锁和解锁位置的策略

时间:2013-05-17 16:10:17

标签: c multithreading mutex

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

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

   }

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

我无法锁定和解锁此变量的互斥锁。 任何人都可以给我一些想法吗? 谢谢!

3 个答案:

答案 0 :(得分: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);
}

答案 1 :(得分: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 */
    } 
  }

  ...

答案 2 :(得分:0)

如何更改代码如下:

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

       }

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

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