2011-09-30 36 views
1

对不起,如果问题标题混淆。我只是想把所有的东西放在一起。 我有一段代码,如:将全局数组锁定在多线程程序中的重入期望函数中?

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. 这甚至有可能使此功能重入?

回答

2

如果说一个功能是折返,它应该只依靠局部变量由两个(或多个线程)同时被称为并返回正确的结果。

如果函数依赖于一些共享的数据,(我们不能真正使其折返),我们可以把它线程安全要由两个(或更多)的线程同时呼吁,如果所有访问共享数据被序列化。

为了让您的函数成为线程安全的,您应该将循环和插入锁定为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; 
} 
+0

@Julien感谢您的编辑和回答。这是我的想法,但我不确定,因为我找不到任何信息。我忘了在返回+1时释放锁定! 我需要一天的时间来获得更多评论,如果有的话 – rightaway717

+1

请记住,您必须在其他地方执行相同的锁定,并且还有代码触及'threads'。 – nos