用互斥锁重新创建sem_wait()?

时间:2013-01-03 11:57:36

标签: c mutex

是否有任何方式,所以我可以在同一个mutex中拥有最多10个主题?

sem_wait()之类的值10

修改

发现这个:

它是使用互斥锁和条件变量的信号量的实现。

typedef struct {
  int value, wakeups;
  Mutex *mutex;
  Cond *cond;
} Semaphore;

// SEMAPHORE

Semaphore *make_semaphore (int value)
{
  Semaphore *semaphore = check_malloc (sizeof(Semaphore));
  semaphore->value = value;
  semaphore->wakeups = 0;
  semaphore->mutex = make_mutex ();
  semaphore->cond = make_cond ();
  return semaphore;
}

void sem_wait (Semaphore *semaphore)
{
  mutex_lock (semaphore->mutex);
  semaphore->value--;

  if (semaphore->value < 0) {
    do {
      cond_wait (semaphore->cond, semaphore->mutex);
    } while (semaphore->wakeups < 1);
    semaphore->wakeups--;
  }
  mutex_unlock (semaphore->mutex);
}

void sem_signal (Semaphore *semaphore)
{
  mutex_lock (semaphore->mutex);
  semaphore->value++;

  if (semaphore->value <= 0) {
    semaphore->wakeups++;
    cond_signal (semaphore->cond);
  }
  mutex_unlock (semaphore->mutex);
}

2 个答案:

答案 0 :(得分:2)

请参阅“如果有帮助”

  

从Book 开始Linux编程计数信号量   采用更广泛的价值观。通常,信号量习惯了   保护一段代码,以便只能运行一个执行线程   它在任何时候。对于这项工作,需要二进制信号量。   有时,您希望允许有限数量的线程   执行一段代码;为此你会使用计数   旗语

答案 1 :(得分:0)

,互斥锁是一个简单的锁,有两种状态:锁定和解锁。创建时,会解锁互斥锁。 互斥锁是互斥锁。只有一个线程可以锁定。

虽然您可以实现允许十个线程使用mutexif以及global variable在一个部分中输入。 (实现计数信号量的方式)

请在此处阅读:Implementing a Counting Semaphore
一个可用的实施:C codeMake your own semaphore