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

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[]是全局数组。我想让这个函数可重入,但这意味着我不应该使用全局变量。我想这是因为全局变量的值在某个时刻是不可预测的。但在我看来,这个数组似乎是相当可预测的。
如果我用互斥锁锁定数组以使这个函数可重入,可以吗?
如果是,那我该怎么做才对?在使用前先锁定第一个元素,然后再解锁?或者在访问每个元素时最好锁定/解锁它?
这甚至可以使这个函数可重入吗?

最佳答案

要说函数是可重入的,它应该只依赖于两个(或多个线程)同时调用的局部变量,并返回正确的结果。
如果函数依赖于某些共享数据(我们不能真正使其可重入),那么如果对共享数据的所有访问都被序列化,我们可以使两个(或更多)线程同时调用它成为线程安全的。
为了使函数线程安全,应该锁定循环并插入threads[]。如果您只锁定循环部分,则有人可以修改循环结束与级别为threads的矫揉造作之间的i内容。

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;
}

关于c - 将全局数组锁定在多线程程序中所需的可重入函数中?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/7607174/

10-10 22:03