aus*_*ton 9 c linux semaphore init
在手册页中,即使您将信号量初始化为值1,也会显示:
sem_init(&mySem, 0, 1);
Run Code Online (Sandbox Code Playgroud)
多次调用时,它仍然可以增加到大于1的值
sem_post(&mySem);
Run Code Online (Sandbox Code Playgroud)
但在这个代码示例中,注释似乎有不同的看法:
sem_init(&mutex, 0, 1); /* initialize mutex to 1 - binary semaphore */
Run Code Online (Sandbox Code Playgroud)
是否可以在C中初始化严格的二进制信号量?
注意:在这种情况下执行此操作而不是使用互斥锁的原因是sem_post和sem_wait可能由不同的线程调用.
如果你想在Linux上使用严格的二进制信号量,我建议用互斥量和条件变量构建一个.
struct binary_semaphore {
pthread_mutex_t mutex;
pthread_cond_t cvar;
int v;
};
void mysem_post(struct binary_semaphore *p)
{
pthread_mutex_lock(&p->mutex);
if (p->v == 1)
/* error */
p->v += 1;
pthread_cond_signal(&p->cvar);
pthread_mutex_unlock(&p->mutex);
}
void mysem_wait(struct binar_semaphore *p)
{
pthread_mutex_lock(&p->mutex);
while (!p->v)
pthread_cond_wait(&p->cvar, &p->mutex);
p->v -= 1;
pthread_mutex_unlock(&p->mutex);
}
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
21551 次 |
最近记录: |