1

什么办法可以让我最多同时拥有 10 个线程mutex吗?

类似于sem_wait()value的东西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);
}
4

2 回答 2

2

看看是否有帮助

来自 Book Begining Linux 编程一个采用更广泛值的计数信号量。通常,信号量用于保护一段代码,以便在任何时候只有一个执行线程可以运行它。对于这项工作,需要一个二进制信号量。有时,您希望允许有限数量的线程执行给定的一段代码;为此,您将使用计数信号量

于 2013-01-03T12:11:27.833 回答
0

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

mutex尽管您可以使用andif和 a实现允许十个线程进入一个部分global variable。(计数信号量的实现方式)

在这里阅读:实现计数信号量
一可用实现:C 代码制作您自己的信号量

于 2013-01-03T12:17:11.357 回答