我找到了以下信号量示例。我目前正在学习线程同步。我几乎没有问题。
1)如果信号量的值为零,我调用semaphore_down是信号量值现在是-1还是semaphore_down只是检查该值是否大于零然后阻塞?
2)我正在为IOS编码,并且没有可用的semaphore_down功能。什么是平等?它与semaphore_wait相同吗?
我想让一个生产者线程永远运行,等待它不需要生成和唤醒它没有阻塞其他线程时。
这似乎是我需要的,但欢迎提出建议。
void reader_function(void);
void writer_function(void);
char buffer;
Semaphore writers_turn;
Semaphore readers_turn;
main()
{
pthread_t reader;
semaphore_init( &readers_turn );
semaphore_init( &writers_turn );
/* writer must go first */
semaphore_down( &readers_turn );
pthread_create( &reader, pthread_attr_default,
(void *)&reader_function, NULL);
writer_function();
}
void writer_function(void)
{
while(1)
{
semaphore_down( &writers_turn );
buffer = make_new_item();
semaphore_up( &readers_turn );
}
}
void reader_function(void)
{
while(1)
{
semaphore_down( &readers_turn );
consume_item( buffer );
semaphore_up( &writers_turn );
}
}
答案 0 :(得分:0)
如果你试图等待一个值为0的信号量,它将永远不会消极 - 它将一直阻塞,直到另一个线程发送到信号量增加它,此时你的线程将被唤醒并减少它
您使用的是哪个信号量库?信号量对象通常仅支持两个操作: post 和 wait ,还可选择初始化和取消初始化方法。因此,根据名称,您的semaphore_wait
应与semaphore_down
相同,但如果没有看到您的信号量库的文档,就无法说出来。
iOS也有POSIX semaphores,您可以使用它。