使用二进制信号量实现计数信号量
Posted
技术标签:
【中文标题】使用二进制信号量实现计数信号量【英文标题】:Implementing Counting-Semaphore Using Binary-Semaphore 【发布时间】:2017-10-03 17:52:50 【问题描述】:我已经实现了某种用户级线程系统。我需要一些帮助来实现计数信号量,使用二进制信号量 实现(如下所述的向上和向下函数)。 这是我实现二进制信号量的接口:
typedef enum BinSemStatus
locked,
unlocked
BinSemStatus;
struct semaphore
BinSemStatus status;
int bid;
;
int bsem_alloc();//allocate a new binary semaphore,return its descriptor
void bsem_free(int id);
void bsem_down(int id);
void bsem_up(int id);
这里是计数信号量接口的接口:
struct counting_semaphore* counting_alloc(uint value);
counting_free(struct counting_semaphore* sem);
// If the value representing the count of
// the semaphore variable is not negative, decrement it by 1. If the
// semaphore variable is now
// negative, the thread executing acquire is blocked until the value is
// greater or equal to 1.
// Otherwise, the thread continues execution.
void up(struct counting_semaphore* sem);
// Increments the value of semaphore
// variable by 1.
void down(struct counting_semaphore* sem);
我试图做的是在 void up(structcounting_semaphore* sem) 锁定值。但正如您在下面看到的那样,这还不够。我在有问题的情况下添加了评论。
struct counting_semaphore
int binary_descriptor;
int value;
;
void down(struct counting_semaphore *sem)
bsem_down(sem->binary_descriptor);
if (sem->value > 0)
sem->value--;
else
//not sure what to do here, maybe use anather semaphore in some way?
bsem_up(sem->binary_descriptor);
void up(struct counting_semaphore *sem)
bsem_down(sem->binary_descriptor);
sem->value++;
bsem_up(sem->binary_descriptor);
【问题讨论】:
counting_free(struct counting_semaphore* sem);
-> void counting_free(struct counting_semaphore* sem);
你还没试过写代码吗?
问题是什么?
缩进/格式化............
当你说它不工作时,出了什么问题?另外,向我们展示不工作的代码。
【参考方案1】:
当sem->value
达到0 时,线程阻塞,是时候重新调度了。你没有显示你的调度代码,所以我不能给出具体的建议。调度程序可能应该代表线程调用bsem_up(sem->binary_descriptor);
。
【讨论】:
【参考方案2】:临界区由sem->binary_descriptor1
保护,每个操作down(S)
和up(S)
使用它来正确更新sem.value
的值
更新这两个操作后,仅当值为正时才释放sem->binary_descriptor2
信号量。
S.value
永远不会是负数,因为任何执行down(S)
的进程都会在sem->binary_descriptor2
处被阻止。
struct counting_semaphore* counting_semaphore_alloc(int value)
struct counting_semaphore* sem = malloc(sizeof(struct counting_semaphore));
sem->value = value;
sem->binary_descriptor1= bsem_alloc();//locks the value
sem->binary_descriptor2= bsem_alloc();//locks the sing of the value
if (value <= 0)
bsem_down(sem->binary_descriptor2);
return sem;
void down(struct counting_semaphore *sem)
bsem_down(sem->binary_descriptor2);
bsem_down(sem->binary_descriptor1);
sem->value--;
if (sem->value>0)
bsem_up(sem->binary_descriptor2);
bsem_up(sem->binary_descriptor1);
void up(struct counting_semaphore* sem)
bsem_down(sem->binary_descriptor1);
sem->value++;
if (sem->value == 1)
bsem_up(sem->binary_descriptor2);
bsem_up(sem->binary_descriptor1);
【讨论】:
以上是关于使用二进制信号量实现计数信号量的主要内容,如果未能解决你的问题,请参考以下文章