并发 - 实现信号量的监视器

标签 c concurrency monitor semaphore

我需要帮助构建一个实现信号量的监视器,简单的 C 示例就可以。

这是为了证明可以在任何可以使用信号量的地方使用监视器。

最佳答案

如果您说允许使用互斥锁/condvars,请检查:

#include <pthread.h>

typedef struct
{
  unsigned int count;
  pthread_mutex_t lock;
  pthread_cond_t cond;
} semaph_t;

int
semaph_init (semaph_t *s, unsigned int n)
{
  s->count = n;
  pthread_mutex_init (&s->lock, 0);
  pthread_cond_init (&s->cond, 0);
  return 0;
}

int
semaph_post (semaph_t *s)
{
  pthread_mutex_lock (&s->lock); // enter monitor
  if (s->count == 0)
    pthread_cond_signal (&s->cond); // signal condition
  ++s->count;
  pthread_mutex_unlock (&s->lock); // exit monitor
  return 0;
}

int
semaph_wait (semaph_t *s)
{
  pthread_mutex_lock (&s->lock); // enter monitor
  while (s->count == 0)
    pthread_cond_wait (&s->cond, &s->lock); // wait for condition
  --s->count;
  pthread_mutex_unlock (&s->lock); // exit monitor
  return 0;
}

关于并发 - 实现信号量的监视器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5558921/

相关文章:

windows - 寻找 Forms.Screen.DeviceName 的可靠映射以监控 EDID 信息

c - printf 不打印在屏幕上

使用 ANSI C 计算先到先服务的等待时间

c - 如何检查用户的输入值是否为负数并最终要求用户再次插入它们?

java - 强制多个线程在可用时使用多个 CPU

java - API后端如何实现线程的公平使用策略?

无法重新分配结构的 c 数组

java - 自定义线程本地随机数生成器

amazon-web-services - 大家是怎么监控RDS PostgreSQL错误日志的?

mysql - 启用 MySQL 性能监视器