【问题标题】:Locking global array in a reentrancy-desired function in a multithreaded program?在多线程程序的可重入函数中锁定全局数组?
【发布时间】:2011-09-30 07:22:41
【问题描述】:

抱歉,如果问题标题令人困惑。我只是想把所有的东西放在一起。 我有一段代码,例如:

int newThread(int(*pfunc)())
{
   pthread_t tid;
   pthread_create(&tid, NULL, pfunc, NULL);
   int i = 0;
   while(threads[i] != 0 && i < MAX_NUM_THREADS)
   {
      if ((MAX_NUM_THREADS - 1) == i)
      {
        puts("We've run out of threads' number limit\n");
        return 1;
      }
      ++i;
   } 
   threads[i] = tid;
   pthread_join(tid, NULL);
   return 0;
}

threads[] 是一个全局数组。我想让这个函数可重入,但这意味着据我所知,我不应该使用全局变量。我想这是因为全局变量的值在某个时间是不可预测的。但就我而言,数组似乎是可以预测的。

  1. 可以吗,如果我用互斥锁锁定数组以使该函数可重入?
  2. 如果是,那我该怎么做呢?只需在使用前锁定第一个元素并在使用后解锁?还是在访问时锁定/解锁每个元素更好?
  3. 这甚至可以使这个函数可重入吗?

【问题讨论】:

    标签: c arrays multithreading locking reentrancy


    【解决方案1】:

    要说一个函数可重入,它应该只依赖局部变量被两个(或多个线程)同时调用并返回正确的结果。

    如果函数依赖于一些共享数据,(我们不能真正让它可重入),我们可以让它线程安全被两个(或更多)同时调用如果对共享数据的所有访问都被序列化,则线程。

    为了使你的函数线程安全,你应该锁定循环并插入threads[]。如果你只锁定循环部分,有人可能会在循环结束和等级i之间修改threads的内容。

    pthread_mutex_t mymutex = PTHREAD_MUTEX_INITIALIZER;
    
    int newThread(int(*pfunc)())
    {
       pthread_t tid;
       pthread_create(&tid, NULL, pfunc, NULL);
       int i = 0;
       pthread_mutex_lock(&mymutex);          // take the lock
       while(threads[i] != 0 && i < MAX_NUM_THREADS)
       {
          if ((MAX_NUM_THREADS - 1) == i)
          {
            puts("We've run out of threads' number limit\n");
            pthread_mutex_unlock(&mymutex);   // don't forget to release the lock here too :)
            return 1;
          }
          ++i;
       } 
       threads[i] = tid;
       pthread_mutex_unlock(&mymutex);        // release the lock
       pthread_join(tid, NULL);
       return 0;
    }
    

    【讨论】:

    • @Julien 感谢您的编辑和回答。这是我的一个想法,但我不确定,因为我找不到任何相关信息。而且我在返回 1.+1 时忘记释放锁!如果有的话,我会花一天时间来获得更多的 cmets
    • 请记住,您必须在其他任何涉及threads 的代码处执行相同的锁定。
    猜你喜欢
    • 1970-01-01
    • 2020-11-29
    • 2022-06-10
    • 1970-01-01
    • 2020-04-16
    • 2012-04-01
    • 2013-05-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多