2010-04-06 27 views
0

我正在为考试而学习,并且对于一个概念有困难。这是伪代码,我给出:如何使用TestAndSet()解决临界区问题?

int mutex = 0; 
do { 
    while (TestAndSet(&mutex)); 
    // critical section 
    mutiex = 0; 
    // remainder section 
} while (TRUE); 

我的教练说,只有两三个必要条件(互斥,进度和有界等待)全部满足与此代码,但我不明白这一个没有遇到...... ??

如何修改代码以支持缺失条件来解决临界区问题?预先感谢任何见解!

+0

我假设“ mutiex“是一个错字。 – 2010-04-06 23:59:49

+0

是的,这是一个错字。 如果不清楚,Set-and-Test定义为 SetAndTest(* target){bool rv = * target; target = True; return rv; } – 2010-04-07 00:04:14

+0

此外,我相信'互斥= 0应该'互斥=假'。 – 2010-04-07 00:39:49

回答

3

如果有人认为这为寻找答案,上面的代码不支持有界的等待(必须有一个约束上的时间量的过程必须等待)。这是正确的代码,以确保所有三个条件都满足,以确保synchronyzation使用SetAndTest:

所有漂亮的小例子
do{ 
    waiting[i] = TRUE; 
    key = TRUE; 
    while(waiting[i] && key) 
    key = TestAndSet(&lock); 
    waiting[i] = FALSE; 

    // Critical Section 

    j = (i + 1) % n; 
    while ((j != i) && !waiting[j]) 
    j = (j+1) % n; 

    if (j == i) 
    lock = FALSE; 
    else 
    waiting[j] = FALSE; 

    // Remainder Section 
} while (TRUE); 
0

是否因为应该使用原子LOAD和STORE指令设置互斥锁,以便内存访问不被重新排序?原则上执行一组指令意味着指令被视为不能被中断的单个步骤。

// example process using mutual exclusion 
void process() { 
    int mutex; 
    init_lock (&mutex); 
    do { 
    lock (&mutex); 
    // critical section 
    unlock (&mutex); 
    //remainder section 
    } while(TRUE); 
} 

// mutual exclusion functions 
void init_lock (int *mutex) { 
    *mutex = 0; 
} 

void lock (int *mutex) { 
    while(TestAndSet(mutex)) 
} 

void unlock (int *mutex) { 
    *mutex = 0; 
} 

int TestAndSet(*target) { 
    int rv = *target; 
    *target = 1; 
    return rv; 
} 

只是看着它,它看来,功能做同样的事情作为较早发布的示例代码,但我想这样可以确保相互排斥,因为在*目标,操作功能是原子...?

借口任何错别字......

1

第一,但检查并设置需要布尔指定参数和默认互斥设置为FALSE。所以int mutex=0实际上是boolean mutex=FALSE。上面的代码确实有互斥和进步,但没有限制等待。您的testandset的定义也是错误的。它应该是target=TRUE而不是target=TRUE

+0

它是伪代码。放松一下whydontya – 2013-01-14 16:59:57

0

在这里没有满足有界的等待。您可以看到必须限制特定进程可以进入临界区的次数,以避免其他进程的匮乏......并且进程应该等待的时间必须有一个限制