【问题标题】:Resource acquisition and pthreads资源获取和 pthreads
【发布时间】:2011-01-23 23:18:13
【问题描述】:

我正在按递增顺序获取一些资源。哪个版本更好?有人告诉我,#2 会导致需要更高编号资源的线程饥饿。这是真的?如果是,如何以及为什么?

a[] sorted array 

1.

for(int i = 1; i < N; ++i) {
  lock(mutex)
  while(!resource_available[a[i]]) {
    pthread_cond_wait(&cond_w[a[i]], &mutex);
  }
  resource_available[a[i]] = 0;
  unlock(mutex)
}

2.

lock(mutex)
for(int i = 1; i < N; ++i) {
  while(!resource_available[a[i]]) {
    pthread_cond_wait(&cond_w[a[i]], &mutex);
  }
  resource_available[a[i]] = 0;
}
unlock(mutex)

编辑: 事实证明,您释放资源的顺序会有所不同,而不是高于构造。如果您按照收到它们的顺序释放它们,则会发生饥饿,如果相反,则可能不会。

【问题讨论】:

标签: c resources pthreads


【解决方案1】:

两者实际上是等效的,因为在示例 1 中,线程几乎总是会在解锁后立即重新获取互斥锁,而不会立即休眠,因为两者之间只有两个表达式。

【讨论】:

  • 你能解释一下为什么没有人会在 #2 中挨饿吗?
  • @niteria:证明否定是出了名的困难。这将取决于线程在此循环之外做什么 - 他们是否花费大量时间持有任何资源?但是,我可以说,您给出的两个循环是等效的 - 解锁互斥锁并不意味着让步,并且互斥锁等待者没有排队。
  • 你是对的,问题在于释放资源的顺序。你知道为什么相反的顺序有帮助吗?
【解决方案2】:

当资源总是可用并且 pthread_cond_wait 不需要运行时,它会导致更多的饥饿。在这种情况下,您将拥有整个循环的互斥锁。因此,如果 N 非常大,那么通过锁定在整个循环之外,您可能会饿死需要互斥锁的其他线程。

锁定最小的必要区域通常是个好主意,以避免其他线程的饥饿和死锁。

当有人来维护这个循环时,也要考虑一下。在 for 循环的主体中添加一些额外的 if 语句/函数调用并创建更多的饥饿将非常容易。维护者可能很容易错过代码中的锁定。你最好通过创建一个负责获取资源 i 的函数来防止这种情况。此函数将负责所有锁定,消除调用代码扩展临界区大小的任何机会。

 // blocks till resource resourceNum is obtained
 void acquire_resource(int resourceNum)
 {
     lock(mutex)
     while(!resource_available[a[i]]) {
       pthread_cond_wait(&cond_w[a[i]], &mutex);
     }
     unlock(mutex)
 }

 for(int i = 1; i < N; ++i) {
     acquire_resource(i);
 }

【讨论】:

  • 但是要么 pthread_cond_wait 释放互斥锁,要么线程成功获取所有资源然后释放互斥锁。我不明白饥饿是如何发生的。
  • 但是 N 是有限的(在我的情况下小于 100),如果所有资源都可用,它会在有限的时间内完成,所以等待互斥锁的线程最终得到它。所以饥饿不会发生。
  • N 可能是有限的,但是您可以通过在循环中添加更多代码来向代码维护者敞开大门,以扩展关键部分的大小。请参阅我的编辑——通过将锁包装在函数调用中,您可以通过清楚地描述两段代码的职责来帮助维护人员避免这种情况。一个在获取资源之前一直阻塞,另一个尝试获取所有 N 个资源。
  • 问题是 #2 中是否会发生饥饿。代码不会被维护,所以不用担心。
【解决方案3】:

我将在 resource_available 函数中进行锁定和解锁,然后仅在等待之前锁定 - 之后立即解锁。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-01-17
    • 1970-01-01
    • 1970-01-01
    • 2019-03-02
    • 2011-05-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多